2

Castle Windsor を IoC コンテナーとして使用しており、オブジェクトを別のオブジェクトに依存して解決したいと考えています。

public MyService : IService
{
  public MyService(MyObject obj)
  {
  }
}

どこで解決するか:

var service1 = container.Resolve<IService>( new { obj = obj1 });
var service2 = container.Resolve<IService>( new { obj = obj1 });

var service3 = container.Resolve<IService>( new { obj = obj2 });

service1 を service2 と同じ (同じ参照) にして、service3 を別のものにしたい。ですから、Singleton や Transient とは異なるライフスタイルが必要です。obj パラメーターが (参照によって) 同じである限り、同じオブジェクトが返されます。

それを達成する方法を知っていますか?

4

2 に答える 2

3

組み込みのソリューションについては知りませんが、いつでも独自の を作成できますILifestyleManager
参考までに、SingletonLifestyleManager の実装をご覧ください。

Castle のカスタム ライフスタイルを作成する方法を実際に調査したことはありません (覚えている限り、Unity で調査しましたCreateInstance) 。価値。

ConcurrentDictionaryケースの保管に役立ちます(Castle'sが何をするのburdenかわかりませんが、これを調査することをお勧めします)。が動的に作成されている場合は、リークに注意してくださいobjs— に興味があるかもしれませんConditionalWeakTable

注:あなたの場合obj、通常はパラメーターCreateメソッドである必要があるという@Stevenに同意しますが、完全を期すために、直接の回答も保持します。

于 2013-07-11T11:45:49.067 に答える
2

最終的に次のような IScopeAccessor を作成しました。

public class PerConstructorScopeAccessor : IScopeAccessor
{
    private static IDictionary<int, ILifetimeScope> Cache = new ConcurrentDictionary<int, ILifetimeScope>();

    public ILifetimeScope GetScope(Castle.MicroKernel.Context.CreationContext context)
    {
        int key = GetContextKey(context);
        if (!Cache.ContainsKey(key))
            Cache.Add(key, new DefaultLifetimeScope());

        return Cache[key];
    }

    private int GetContextKey(Castle.MicroKernel.Context.CreationContext context)
    {
        int hash = 0;

        foreach (var value in context.AdditionalArguments.Values)
        {
            hash = HashCode.CombineHashCode(hash, value.GetHashCode());
        }

        return hash;
    }

    #region IDisposable

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            disposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    #endregion
}

そして、依存関係を登録するよりもLifestyleScoped<PerConstructorScopeAccessor>()

于 2013-07-11T13:19:26.443 に答える