Внедрение DI в конкретной ситуации - PullRequest
1 голос
/ 10 марта 2012

Я пытаюсь реализовать DI в классе, но я не уверен, что мой дизайн подходит.

Соответствующий код в классе, к которому я хочу добавить DI к

class DoerValidation 
{
   public DoerValidation()
   {
       compileData();
   }

   private void compileData()
   {
       doersActive = Doer.GetActiveDoers();
       //...
   }
}

А в моем Doer классе

public partial class Doer
{
   private static readonly DoerRepository repository = new DoerRepository();

   public static IEnumerable<Doer> GetActiveDoers()
   {
       return repository.Doers.Where(c => c.Person.IsActive);
   }
}

Я просто не понимаю, как я мог реализовать DI в этой ситуации. Может быть, метод GetActiveDoers плохой дизайн? Где бы вы поместили этот метод в противном случае?

Будет ли хорошей практикой начинать добавлять новые методы непосредственно в хранилище? Некоторые люди говорили мне, что он должен оставаться чистым, поэтому он реализует только это

public interface IDoerRepository
{
    IQueryable<Doer> Doers { get; }
    void SaveDoer(Doer doer);
    void DeleteDoer(Doer doer);
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Звучит так, как будто вам нужно вставить DoerRepository в DoerValidation, в основном - передать его в конструктор.

И GetActiveDoers, и статическая переменная идут вразрез с принципами DI, IMO.

1 голос
/ 10 марта 2012

Статические методы и свойства носят процедурный характер.Если вы статически предоставляете свой метод GetActiveDoers (), то нет способа внедрить его функциональность - клиенты могут игнорировать его или использовать его встроенным образом, когда это необходимо.

Если вы привержены DI и статическомуреализации, вам нужно написать оболочку экземпляра для этого статического класса и внедрить оболочку экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...