Я использую Ninject Factory Extension и создаю собственный поставщик экземпляров, объясненный в вики:
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.