如果我有一个由多个图层组成的应用程序,在解决方案中定义为多个项目,是否可以让图层直接在其上方/下方引用该图层?或者,是否应该使用依赖注入来消除这种需求?
我正在建立一个更具体的问题,我问here,但我想提供更一般的建议。
我如何在VS2010中设置这样的项目?我需要第三个项目来容纳DI的东西吗?(我正在使用Ninject)
编辑:示例
以下是我的两个图层的示例。第一层有一个IUnitOfWork接口,第二层有一个实现所述接口的类。以这种方式设置,除非第2层具有对第1层的引用,否则不会构建项目。如何避免这种情况?或者,我是否应该甚至不担心参考文献并将其单独留下,因为这些图层彼此相邻?
第1层
public interface IUnitOfWork
{
void Save();
}
第2层
public DataContext : IUnitOfWork
{
public void Save()
{
SaveChanged(); //...
}
}
答案 0 :(得分:1)
一般建议是通过接口对层进行分离,并使用依赖注入和IoC容器,以便在维护应用程序的同时实现极大的灵活性。 但有时它可能对小型应用程序来说太过分了,所以为了给你一个更具体的例子,你必须至少提供它所具有的应用程序和层的描述。
关于DI的东西,我建议将它封装在一个单独的程序集中。
请参阅Martin Fowler撰写的精彩文章Inversion of Control Containers and the Dependency Injection pattern
编辑:回答有关界面的评论
只有一种摆脱这种耦合的方法是将公共接口/类存储在单独的程序集中。在您的情况下,创建单独的程序集并在此处放置IUnitOfWork
接口。
编辑: Ninject项目参考
有147个Ninject项目,我建议您从您的角度下载和调查最有趣的项目:Ninject projects
答案 1 :(得分:1)
这是一个众所周知的“紧密耦合与松散耦合”的困境,并没有一般性的建议。这在很大程度上取决于您的组件有多大,它们如何交互,它们变化的频率,哪些团队对它们起作用,您的构建时间是多少。
我的一般建议是保持平衡。不要因为解开每个迷你类而疯狂,另一方面也不要创造一个小块,一个小的修改会导致整个世界的重建。
这总是一种权衡:
每项决定都有相关费用:
必须在紧密耦合的组件之间进行更改的成本是众所周知的。 - 改变是侵略性的 - 确定依赖链中的所有内容可能需要做大量的工作 - 很容易错过依赖 - 保证质量很难
另一方面,过度工程的成本也很差 - 代码臃肿 -复杂 - 较低的发展 - 新开发人员难以提高工作效率
举个例子: 查看随Microsoft Microsoft应用程序块一起提供的Stoplight示例
答案 2 :(得分:0)
人们已经回答了你的问题。我建议“下面”层不应该引用“上面”层,因为下面的层目的是提供上层消耗的某些功能,因此它不应该知道任何关于上层的内容。就像TCP / IP堆栈的漂亮层模型