2012-03-01 3 views
1

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

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?

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

ответ

3

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

+0

Это сделало бы чувство. Поэтому я должен выбирать между разоблачением моих сеттеров миру и не использованием DI. Это неудачно! – Mathieu

+0

Или, может быть, это просто плохой дизайн на моей стороне? – Mathieu

+0

Просто плохой дизайн, вероятно (без обид). Что определяет, должен ли 'IsDataModelActive' быть истинным или ложным? –

2

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

+0

Кажется, это лучшая идея. Это заставляет меня посылать дважды тот же объект (зависимость) как два параметра, но это достойное решение. – Mathieu