1

実行時の変数に基づいてオブジェクトをインスタンス化するようにNinjectを作成するにはどうすればよいですか?

ユーザー入力からのパラメーターに基づいて、コントローラーアクション(MVC 3-)に正しいリポジトリーを挿入しようとしています。ユーザーが「BMW」と入力すると、にバインドICarRepository されBMWRepository、「KIA」と入力KiaRepositoryすると注入されます。

[HttpPost]
public ActionResult SearchResult(FormCollection values)
{
    string carModel  = values["model"];

    ICarRepository myRepository = RepositoryFactory.getRepository(carModel);

    .....
}

これは、switch / case noobインスタンス化またはパラメータ化されたファクトリによって知られており、Ninjectを使用せずに手動で行う方法を知っています。ここで説明されている4つのアプローチを確認してください。ファクトリパターンの調査

私の質問は、Ninjectでそれを行う方法ですか?

4

1 に答える 1

5

抽象ファクトリ(おそらく単なる)を注入しFunc<string,ICarRepository>、以下を追加することですべてを実装することができますRegisterServices

Bind<ICarRepository>().To<KiaRepository>().Named("KIA")
Bind<ICarRepository>().To<BmwRepository>().Named("BMW")
Bind<Func<string,ICarRepository>>()
    .ToMethod( ctx=> name => ctx.Get<ICarRepository>( name));

あなたのctorで:

class MyController
{
    readonly Func<string,ICarRepository> _createRepository;

    public MyController(Func<string,ICarRepository> createRepository)
    {
        _createRepository = createRepository;
    }

次に、あなたの行動で:

[HttpPost]
public ActionResult SearchResult(FormCollection values)
{
    string carModel  = values["model"];

     using( ICarRepository myRepository = _createRepository( carModel)) 
     {
            ... 
     } 
}
于 2012-10-24T21:46:54.950 に答える