1

を介して注入されている依存関係がありFunc<Owned<OwnedDependency>>ます。その依存関係の1つには、OwnedDependencyを構築する時点でのみ持つパラメーターが必要です。

public class OwnedDependency
{
    public OwnedDependency(IDependency1 dependency)
    {
    }
}

public interface IDependency1
{
}

public class Dependency1 : IDependency1
{
    public Dependency1(MyParameter parameter)
    {
    }
}

public class MyClass
{
    private readonly Func<Owned<OwnedDependency>> m_ownedDependencyFactory;

    public MyClass(Func<Owned<OwnedDependency>> ownedDependencyFactory)
    {
        m_ownedDependencyFactory = ownedDependencyFactory;
    }

    public void CreateOwnedDependency()
    {
        var parameter = new MyParameter(...);
        // ** how to setup parameter with the container? **

        using (var ownedDependency = m_ownedDependencyFactory())
        {
        }
    }
}

MyParameterのインスタンスを設定するクリーンな方法を見つけることができません。

私が調査した1つのアプローチは、ILifetimeScopeをMyClassに挿入してから、次のようなことを行うことです。

var parameter = new MyParameter(...);

using (var newScope = m_lifetimeScope.BeginLifetimeScope())
{
    newScope.Resolve<IDependency1>(new TypedParameter(typeof(MyParameter), parameter));
    var ownedDependency = newScope.Resolve<OwnedDependency>();
    // ...
}

しかし、コンテナは不必要に邪魔になりつつあります。理想的には、注入することでFunc<IDependency1, Owned<OwnedDependency>>あり、コンテナーは、OwnedDependencyの依存関係だけでなく、必要な依存関係を満たすために渡されたパラメーターを喜んで使用します。

4

1 に答える 1

1

別のファクトリを使用して2つのステップで解決を行うのはどうですかIDependency1

public class MyClass
{
    private Func<MyParameter, IDependency1> dependency1Factory;
    private Func<IDependency1, Owned<OwnedDependency>> ownedDependencyFactory;


    public MyClass(
        Func<MyParameter, IDependency1> dependency1Factory,
        Func<IDependency1, Owned<OwnedDependency>> ownedDependencyFactory)
    {
        this.dependency1Factory = dependency1Factory;
        this.ownedDependencyFactory = ownedDependencyFactory;
    }

    public void CreateOwnedDependency()
    {
        var parameter = new MyParameter();
        using (var owned = ownedDependencyFactory(dependency1Factory(parameter)))
        {
        }

    }
}
于 2012-04-25T15:05:26.793 に答える