4

次のコードを検討してください

public interface ISomeInterface
{
    void DoSomething();
}

public class A : ISomeInterface
{
    public void DoSomething() { }
}

public class B : ISomeInterface
{
    public void DoSomething() { }
}

そして、2 つのインターフェースを使用する 1 つのクラス:

public class C : IC
{
    protected ISomeInterface _dependency1;
    protected ISomeInterface _dependency2;

    public C ( ISomeInterface dependency1, ISomeInterface dependency2 )
    {
        _dependency1 = dependency1;
        _dependency2 = dependency2;
    }
}

A を依存関係 1 に、B を依存関係 2 に注入したいと思います。私はそのようなことができることを知っています:

builder.RegisterType<C>().As<IC>()
    .WithParameter( "dependency1", new A() )
    .WithParameter( "dependency2", new B() );

しかし、Autofac でそれを行うより良い方法があることは知っています。

4

2 に答える 2

2

移植を登録するとき、名前ISomeInterfaceを付けることができます:

containerBuilder.RegisterType<A>().Named<ISomeInterface>("A");
containerBuilder.RegisterType<B>().Named<ISomeInterface>("B");

次にC、定義された名前を使用して引数を解決するために登録できます。

containerBuilder.Register(c =>
    new C(c.ResolveNamed<ISomeInterface>("A"), 
        c.ResolveNamed<ISomeInterface>("B")))
    .As<IC>();

C上記のコードを使用すると、一部のパラメーターが「名前付き」登録を必要としない場合でも、すべてのコンストラクター パラメーターを指定する必要があります。

したがって、「名前付き」パラメーターのみを指定したい場合はWithParameter、解決を一緒に使用できます。

containerBuilder.RegisterType<C>().As<IC>()
    .WithParameter((p, c) => p.Name == "dependency1", 
                   (p, c) => c.ResolveNamed<ISomeInterface>("A"))
    .WithParameter((p, c) => p.Name == "dependency2", 
                   (p, c) => c.ResolveNamed<ISomeInterface>("B"));
于 2012-10-27T19:10:26.460 に答える
1

まず、なぜ同じインターフェースの 2 つのインスタンスを注入したいのでしょうか? それはそれらを区別するものでなければなりませんか?

私の提案は、2 つのサブ インターフェイスを登録することです。ISomeInterface1 : ISomeInterface ISomeInterface2 : ISomeInterface を挿入し、これら 2 つを注入します。その後、名前付きパラメーターを処理する必要はありません。

于 2012-10-28T08:47:39.590 に答える