Смешивание инкапсуляции и внедрение зависимостей - PullRequest
1 голос
/ 01 марта 2012

У меня есть класс, который служит моделью данных. Я упросту это так:

public class DataModel
{
   public bool IsDataModelActive {get; internal set;}
}

Так что программисты, которые будут использовать мою DLL, увидят только то, что им нужно, не рискуя что-нибудь сломать.

С другой стороны, я хочу использовать DI в моих классах, которые используют DataModel. Поэтому я должен создать интерфейс:

public interface IDataModel
{
   bool IsDataModelActive {get;}
}

И вот я делаю это в своем классе:

public class Class1
{
   IDataModel dataModel;

   public Class1(IDataModel dataModel)
   {
      this.dataModel = dataModel
   }
}

В этом случае я не могу получить доступ к установщику dataModel.IsDataModelActive.

Лучший патч, который я нашел, это наложить после получения инъекции:

public class Class1
{
   DataModel dataModel;

   public Class1(IDataModel dataModel)
   {
      this.dataModel = (DataModel)dataModel
   }
}

Это помогает для модульных тестов, но как бы нарушает всю концепцию DI. Что если у меня есть другой класс, который реализует IDataModel?

Какую стратегию вы / будете использовать?

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Если интерфейс IDataModel не позволяет вам получить доступ к установщику извне DataModel, то (надеюсь, неудивительно) вам не нужно запрашивать доступ к установщику извне DataModel.Либо сама DataModel, либо что-то, что может видеть установщик, должно отвечать за установку этого значения.

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

Является ли Class1 публично видимым, то есть доступным для потребителей?Если нет, то создайте другой внутренний интерфейс IDataModelInt: IDataModel и предоставьте установщик там.Используйте второй для своей внутренней работы.

...