2

Ninject Factory Extensionを使用しており、wikiで説明されているカスタムインスタンスプロバイダーを作成しています。

class UseFirstArgumentAsNameInstanceProvider : StandardInstanceProvider
{
    protected override string GetName(System.Reflection.MethodInfo methodInfo, object[] arguments)
    {
        return (string)arguments[0];
    }

    protected override Parameters.ConstructorArgument[] GetConstructorArguments(System.Reflection.MethodInfo methodInfo, object[] arguments)
    {
        return base.GetConstructorArguments(methodInfo, arguments).Skip(1).ToArray();
    }
}

次のファクトリインターフェイスを定義しました。

interface IFooFactory
{
    IFoo NewFoo(string template);
}

次のバインディングを作成しました。

kernel.Bind<IFooFactory>().ToFactory(() => new UseFirstArgumentAsNameInstanceProvider());
kernel.Bind<IFoo>().To<FooBar>().Named("Foo");

次を呼び出すと、次のインスタンスが表示されますFooBar

var foobar = fooFactory.NewFoo("Foo");

これはすべてうまくいきます。しかし、私が欲しいのはもう少しこのようなものです:

interface IFooTemplateRepository
{
     Template GetTemplate(string template);
}

名前( "Foo")に基づいてテンプレートを返すリポジトリがあり、そのテンプレートをコンストラクター引数として渡したいと思います。

public class FooBar
{
    public FooBar(Template template)
    {
    }
}

これは可能ですか?ITemplateRepositoryに何が依存しているのかわかりません。

4

1 に答える 1

1

エンティティのインスタンスを作成するために IoC コンテナーを使用しないでください。これはビジネス ロジックであるため、コンポジション ルートには属しません。これを処理する正しい方法は、ORM を直接使用することです (たとえば、使用しているリポジトリ パターンで)。

var template = this.templateRepository.Get("SomeTemplate");
var fooBar = this.fooBarFactory.CreateFooBar(template);
于 2012-04-02T22:35:22.913 に答える