2015-02-20 3 views
0

Давать следующий пример:Всегда Действительный Entity и Constructor Injection

class Customer 
{ 
    ICustomerRepository repository; 

    private string name; 

    public Customer(string name, ICustomerRepository repository) 
    {   
     Name = name; 
     this.repository= repository; 
    } 

    public string Name 
    { 
     get {return name;} 
     set 
     { 
      if(String.IsNullOrWhiteSpace(value)) 
       throw new ArgumentException(); 

      name = value; 
     } 
    } 
} 
  • Я использую Ninject IoC.
  • Я абстрагирую контейнер ninject в интерфейсе IFactory, который имеет метод Get <>(), поэтому я хочу использовать только инъекцию конструктора. Я делаю это, потому что я не хочу использовать атрибуты [Inject].
  • Я хочу следовать принципу всегда действительной сущности.

В этом случае я не могу этого сделать, потому что у меня есть параметр в конструкторе. Есть ли другой подход к этому?

Edit:

  • я отвлекаюсь Ninject контейнер в интерфейсе IFactory, который имеет метод Get <>(), так что я хочу использовать только инъекции конструктора. Я делаю это, потому что я не хочу использовать атрибуты [Inject].

Абстракция моего контейнера:

interface IFactory 
{ 
    T Get<T>(); 
    IEnumerable<T> GetAll<T>(); 
} 

Реализация:

class ApplicationFactory : IFactory 
{ 
    private readonly IKernel ninjectKernel = ApplicationNinjectKernel.BuildNew(); 

    public T Get<T>() 
    { 
     return ninjectKernel.Get<T>(); 
    } 

    public IEnumerable<T> GetAll<T>() 
    { 
     return ninjectKernel.GetAll<T>(); 
    } 
} 

ApplicationNinjectKernel.BuildNew() создает и возвращает новый StandarKernel() с оков ..

Конструктор Аргумент звучит плохо для меня. При таком подходе я добавлю некоторые уродливые вещи в свой код, а также пропущу проверку типа во время проекта. :/

+1

Почему вы пытаетесь следовать принципу «Всегда действительная сущность». Вы знаете, что это анти-шаблон? http://jeffreypalermo.com/blog/the-fallacy-of-the-always-valid-entity/ –

+0

Посмотрите: https://andyhitchman.wordpress.com/2009/05/15/the-always-valid -entity-is-not-a-fallacy/ –

+1

Мне что-то не хватает. в чем именно проблема?: –

ответ

1

Если вы пытаетесь использовать Ninject для решения с использованием данного имени клиента, вы можете сделать это следующим образом:

var customer = kernel.Get<Customer>(new ConstructorArgument("name", "Bob")); 

Это также требует, чтобы вы следовали конвенции связывания вашего ICustomerRepository в Ninject Модуль и загрузил его в ядро ​​Ninject. Пример:

public override void Load() 
{ 
    Bind<ICustomerRepository>().To<CustomerRepository>(); 
} 
+1

Если вы не знаете имя вверху (вид маловероятно), это возможно только при использовании Ninject в качестве локатора сервисов. – chris

+1

@chris: Это правильно. Хотя в этом случае ОП, похоже, создает странную альтернативу Factory, в которой он использует DI для создания своих объектов. Я не совсем уверен, какова цель этого, но так оно и будет выполняться, учитывая предоставленный образец кода. –

+0

Tks для ответа. Я редактировал свой вопрос, пожалуйста, еще раз. –

Смежные вопросы