2012-03-01 88 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之外访问setter,那么(希望不奇怪)你不应该需要从DataModel之外访问setter。 DataModel本身或者可以看到setter的东西都应该负责设置该值。

+0

这将使sens。所以我必须选择将我的制片人展示给世界,而不是使用DI。那真不幸! – Mathieu 2012-03-01 16:54:30

+0

或者这可能只是我身边的糟糕设计? – Mathieu 2012-03-01 16:59:15

+0

只是不好的设计可能(没有进攻)。什么定义了“IsDataModelActive”应该是真还是假? – 2012-03-01 17:02:48

2

Class1是公开可见的 - 即暴露给消费者吗?如果不是,则创建另一个内部接口IDataModelInt:IDataModel并在那里提供setter。使用第二个为你的内部工作。

+0

这似乎是最好的主意。它迫使我发送两次相同的对象(依赖)作为两个参数,但这是一个体面的解决方案。 – Mathieu 2012-03-01 17:02:49