0

Unity Application Block の使用に問題があります。Composition という基本クラスを作成しました。

各コンポジションには IUnityContainer が含まれています。最上位オブジェクトの UniversalComposition を作成するときに、UnityContainer で初期化したいと考えています。

IUnityContainer.CreateChildContainer メソッドを使用して、子 IUnityContainer をそれに挿入したい UniversalComposition から作成されるオブジェクト。

class Program
{
    static void Main(string[] args)
    {
        UniversalComposition universe = new UniversalComposition();


    }
}

public class UniversalComposition : Composition
{
    // Everything that gets resolved in this container should contain a child container created by the this container

    public UniversalComposition()
    {
        this.Container.RegisterType<IService, Service>();
    }

    protected override IUnityContainer CreateContainer()
    {
        return new UnityContainer();
    }

}

public abstract class Composition
{
    protected IUnityContainer Container {get; private set;}

    public Composition()
    {
        this.Container = this.CreateContainer();
    }

    public TInstance Resolve<TInstance>()
    {
        return this.Container.Resolve<TInstance>();
    }

    protected abstract IUnityContainer CreateContainer();
}

public class Service : Composition, IService
{
    public Service(/* I want to inject a child Unity Container in here container.CreateChildContainer() */)
    {
    }
}

public interface IService { }
4

1 に答える 1

1

親オブジェクトはインスタンス化されるまで親コンテナが存在しないため、これは親に実装されているため、インジェクションでは機能しないと思います。したがって、注入する子コンテナを生成する方法はありません。より良い方法は、基本クラスのパラメーター化されたコンストラクターを介して親コンテナーを注入してから、子クラスに両方を注入することです。デフォルトのコンストラクターはnullを使用してパラメーター化されたコンストラクターを呼び出すことができ、パラメーター化されたコンストラクターはこれを検出して、コンテナーが指定されていない場合はコンテナーを作成できます。以下の例は、わかりやすくするために簡略化されています。

public abstract class BaseClass
{
    public IUnityContainer Container { get; protected set; }

    public BaseClass() : BaseClass(null) {}

    public BaseClass( IUnityContainer container )
    {
        this.container = container ?? this.CreateContainer();
    }

    public abstract IUnityContainer CreateContainer();
}

public class DerivedClass : BaseClass
{
    public IUnityContainer ChildContainer { get; private set; }

    public DerivedClass() : DerivedClass(null,null) {}

    public DerivedClass( IUnityContainer parent, IUnityContainer child )
        : BaseClass( parent )
    {
        this.ChildContainer = child ?? this.CreateChildContainer();
    }

    public IUnityContainer CreateContainer()
    {
         return new UnityContainer();
    }

    public IUnityContainer CreateChildContainer()
    {
         return this.Container.CreateChildContainer();
    }

}
于 2008-12-07T21:45:05.017 に答える