2017-02-16 68 views
2

我有一个三层应用程序。每个部分都与我的解决方案的另一部分有依赖关系。我曾经在MVC项目中实现了IDependencyResolver。这是一种错误的方式,因为它会导致违反层分离的架构规则。我的MVC项目引用了DAL层。这是一种糟糕的编码习惯。我知道我可以创建一个单独的类库项目。它将引用我的解决方案的任何其他项目。它将解决所有的依赖关系。我听说这不是最好的方法。有一个更好的办法。我的解决方案的每个项目都应该解决它拥有的依赖关系。我不明白如何把它放在一起。所以我发现这篇有用的文章:Dependency Injection Best Practices in an N-tier Modular Application,但它似乎太困难和复杂。有另一种方法吗?我有一个类似的解决方案结构。 UserRepository返回一个请求的用户。如何在N层图层应用程序中实现IDependencyResolver?

public interface IUserRepository 
    { 
     IEnumerable<UserEntity> GetAll(); 
    } 

    public class UserRepository : IUserRepository 
    { 
     public IEnumerable<UserEntity> GetAll() 
     { 
      // some code 
     } 
    } 

UserService可以有几个不同的依赖关系。

public interface IUserService 
    { 
     IEnumerable<UserModel> GetAll(); 
    } 

    public class UserService : IUserService 
    { 
     private readonly IUserRepository userRepository; 
     private readonly ISecondRepository secondRepository; 
     private readonly IThirdRepository thirdRepository; 

     public UserService(IUserRepository userRepository, ISecondRepository secondRepository, IThirdRepository thirdRepository) 
     { 
      this.userRepository = userRepository; 
      this.secondRepository = secondRepository; 
      this.thirdRepository = thirdRepository; 
     } 

     public IEnumerable<UserModel> GetAll() 
     { 
      // some code 
     } 
    } 

最后UserController构造函数可能有很多不同的依赖关系。

我的问题是关于什么是正确的,最简单的方法来解决这些依赖关系,避免违反架构规则?

enter image description here

+0

想想运行时的层分离规则。当应用程序由依赖解析器引导时,如果您已正确映射解析器,它将遵循这些规则。看看这个答案http://stackoverflow.com/questions/40401900/bootstrapping-unity-composition-root-location/40403875#40403875 –

+0

可能重复[Ioc/DI - 为什么我必须引用所有层/组件in entry application?](http://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to-reference-all-layers-assemblies-in-entry-application) – NightOwl888

回答

2

喜欢你说可以创建附加层,其将组成依赖性,这就是所谓的组合物根Check this SO question。 在你的情况下,组合根是MVC项目。 从我的角度来看,引用DAL并不是那么糟糕的做法。当我们谈论依赖关系时,应该画线。对于我来说,当我们谈论依赖关系时,并不是那么重要的dll引用,而是使用的类型(接口或具体)。正如你所知,DI是关于取决于具有实际价值的抽象的。因此,只要您仅依赖DAL中的接口,您的代码仍然可以。

在实践中,当dll依赖关系变得过于复杂时,我将其他项目用作组合根。

关于你的问题关于图层应该如何解决它们的依赖关系。我不确定这是否是你的意思,但是在DDD中练习BLL来自定义层中的基础结构接口(如存储库)。这种方式依赖图是崇敬。现在基础设施层(DAL)只定义BLL提供的接口的具体实现,并且再次在组合根中连接一切。

第一种方法其中基础结构层定义了接口并且实现具有无依赖性的优点,这对于跨不同项目的重用是合适的。但请记住,在大领域工作有时可能会导致无法形容的代码。

作为DDD的第二种方法最重要的是域,所以一切适用于域。根据我的经验,围绕该域的结构良好的图层是最佳选择。这个apporach让你的代码更清楚地解释你为这个域所解决的问题。 我不知道我是否正确地表达了我的自我。

作为最后说明我会建议你DDD的方法,如果使用这只是一个学习experiances。学习新东西是最好的选择。

我不是这个领域最有经验的人。 我是程序员大约3年,并主要在中型项目上工作,所以我的意见并不稳固;]