Поставщик пользовательских экземпляров Ninject Factory - PullRequest
2 голосов
/ 03 апреля 2012

Я использую 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.

1 Ответ

1 голос
/ 03 апреля 2012

Не используйте контейнер IoC для создания экземпляров сущностей.Это бизнес-логика и, следовательно, она не принадлежит корню композиции.Правильный способ справиться с этим - использовать ORM напрямую (например, с шаблоном репозитория, который вы используете).

var template = this.templateRepository.Get("SomeTemplate");
var fooBar = this.fooBarFactory.CreateFooBar(template);
...