2

DI コンテナーがあり、DI コンテナーを介してコンストラクターに引数を渡したいと考えています。

つまり、

public interface IPerson { }

public class Person : IPerson {
    private int _personId;

    Person() { _personId = 0; }
    Person(int id) { _personId = id; }
}
...
Container.Register(Component.For<IPerson>().ImplementedBy<Person>().Lifestyle.Transient);
...
//Person is already available
Container.Resolve<Person>(55);

//Person is not available
Container.Resolve<Person>();

これは基本的に私がやりたいことです。新しいクラスを作成する必要がある場合もあれば、既にクラスを利用できる場合もあります。どうすればこれを達成できますか?

動的パラメーターを使用できるのではないかと考えましたが、方法がわかりません。

前もって感謝します。


Factory パターンはソリューションをエレガントにしますが、必要なのは非常に単純なソリューションであり、同様に機能する場合、これは私のアプリケーションに多くの複雑さを追加します。

自分自身に単一の整数を渡すことは、同じ仕事をするためにファクトリー全体を書くよりもはるかに簡単です。

4

2 に答える 2

7

Resolve使用するパラメーター値を指定するメソッドに匿名型を渡すことができます。

container.Resolve<IPerson>(new { id = 5 });

ただし、アプリケーションのさまざまなポイントで のインスタンスを作成する場合はPerson、コンテナーを参照したくないため、PersonFactory代わりにコンテナーを介して解決される を使用する必要があります。Typed Factory Facilityをご覧ください。

于 2012-06-27T11:47:07.030 に答える
1

これは、コンストラクターにパラメーターを渡す方法の私の例です(DIコンテナーは1です):

 static void Main(string[] args)
 {
     IUnityContainer container = new UnityContainer();

     container.RegisterType<ILogger, FileLogger>(new InjectionConstructor(new[] { "c:\\myLog.txt" }));
     ILogger logger = container.Resolve<FileLogger>();
     logger.Write("My message");
     Console.ReadLine();
 }

「新しいクラスを作成する必要がある場合もあれば、すでにクラスを利用できる場合もあります。これをどのように達成しますか?」-ファクトリパターンを実装してみてください

于 2012-06-27T11:49:03.997 に答える