好的..经过所有讨论之后,我将稍微更改我的问题以更好地反映我正在处理的具体示例。
我有两个类,ModelOne
和ModelTwo
,这些类执行类似的功能,但彼此无关。但是,我有一个第三类CommonFunc
,其中包含一些公共功能,这两种功能都在两者中实现ModelOne
,ModelTwo
并且已根据进行了分解DRY
。这两个模型是在ModelMain
类中实例化的(它本身是在更高级别上实例化的,但是我将在这个级别上停止)。
我正在使用的IoC容器是Microsoft Unity。我不假装自己是专家,但是我的理解是,您在容器中注册了一个接口和类的元组,当您想要一个具体的类时,您会向IoC容器询问与特定接口匹配的任何对象。这意味着对于我要从Unity实例化的每个对象,都必须有一个匹配的接口。因为我的每个类都执行不同的功能(且不重叠),所以这意味着接口和类1之间的比例为1:1。但是,这并不意味着我正在为每个编写的类都刻苦地编写一个接口。
因此,在代码方面,我最终得到2:
public interface ICommonFunc
{
}
public interface IModelOne
{
ICommonFunc Common { get; }
..
}
public interface IModelTwo
{
ICommonFunc Common { get; }
..
}
public interface IModelMain
{
IModelOne One { get; }
IModelTwo Two { get; }
..
}
public class CommonFunc : ICommonFunc { .. }
public class ModelOne : IModelOne { .. }
public class ModelTwo : IModelTwo { .. }
public class ModelMain : IModelMain { .. }
问题是关于如何组织我的解决方案。我应该将类和接口保持在一起吗?还是应该将类和接口保持在一起?例如:
选项1- 按班级名称组织
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-Main
| |
| |-IModelMain.cs
| |-ModelMain.cs
|
|-One
| |
| |-IModelOne.cs
| |-ModelOne.cs
|
|-Two
|
|-IModelTwo.cs
|-ModelTwo.cs
|
选项2-按功能组织(主要)
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-IModelMain.cs
|-IModelOne.cs
|-IModelTwo.cs
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
选项3-分离接口和实现
MySolution
|
|-MyProject
|
|-Interfaces
| |
| |-Models
| | |
| |-Common
| | |-ICommonFunc.cs
| |
| |-IModelMain.cs
| |-IModelOne.cs
| |-IModelTwo.cs
|
|-Classes
|
|-Models
| |
|-Common
| |-CommonFunc.cs
|
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
选项4-进一步介绍功能示例
MySolution
|
|-MyProject
| |
|-Models
| |
|-Components
| |
| |-Common
| | |
| | |-CommonFunc.cs
| | |-ICommonFunc.cs
| |
| |-IModelOne.cs
| |-IModelTwo.cs
| |-ModelOne.cs
| |-ModelTwo.cs
|
|-IModelMain.cs
|-ModelMain.cs
|
我有点不喜欢选项1,因为路径中的类名。但正如我倾向于1:1分的比例,因为我选择的IoC /使用的(并且这可能是有争议的)这种在看到文件之间的关系优势。
选项2对我很有吸引力,但现在我已经使ModelMain
和子模型之间的水变得浑浊。
选项3可以将接口定义与实现分开,但是现在我在路径名中有这些人为的中断。
选项4。我选择了选项2并对其进行了调整,以将组件与父模型分离。
是否有充分的理由偏爱一个?还是我错过的任何其他潜在布局?
弗兰克(Frank)发表评论说,比率为1:1可以追溯到.h和.cpp文件的C ++天。我知道他从哪里来。我对Unity的理解似乎使我陷入了困境,但是如果您也遵循Program to an interface
But 的说法,那我什至不知道如何摆脱困境。
2.我省略了每个对象构造函数的详细信息。这是IoC容器根据需要注入对象的地方。
Client1
需要IBase
时提供一个Derived1
。当Client2
需要时IBase
,IoC提供一个Derived2
。
interface
它了。An interface
实际上只是具有所有虚拟成员的抽象类。