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に何が依存しているのかわかりません。