如何在N层图层应用程序中实现IDependencyResolver?

时间:2017-02-16 12:44:32

标签: c# .net asp.net-mvc dependency-injection unity-container

我有一个三层应用程序。每个部分都与我的解决方案的另一部分有依赖关系。我曾经在MVC项目中实现$width: 100px; $margin: 5px; $extra-padding: 10px; $column-width: $width + 2 * $margin; $num-blocks: 9; @function screen-size($n) { @return $n * $column-width + $extra-padding; } .grid { margin: 0 auto; width: $num-blocks * $column-width; font-size: 0; } .item { display: inline-block; margin: $margin; width: $width; height: 100px; background: red; } @media screen and (max-width: screen-size(2)) { .grid { width: $column-width; } } @for $i from 2 through $num-blocks { @media screen and (min-width: screen-size($i) + 1px) and (max-width: screen-size($i + 1)) { .grid { width: $i * $column-width; } } } 。这是一种错误的方法,因为它会导致违反层分离的架构规则。我的MVC项目引用了DAL层。这是一个糟糕的编码实践。我知道我可以创建一个单独的类库项目。它将引用我的解决方案的任何其他项目。它将解决所有依赖项。我听说这不是最好的方式。有一个更好的办法。我的解决方案的每个项目都应解决它拥有的依赖关系。我不明白如何把它们放在一起。所以我找到了这篇有用的文章:Dependency Injection Best Practices in an N-tier Modular Application但它似乎太难了和复杂。还有另外一种方法吗?我有一个类似的解决方案结构。 IDependencyResolver返回一个请求的用户。

UserRepository

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 } } 构造函数可能有很多不同的依赖项。

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

enter image description here

2 个答案:

答案 0 :(得分:2)

就像你说的那样你可以创建一个组成依赖关系的附加层,这称为组合根Check this SO question。 在您的情况下,组合根是MVC项目。 从我的角度来看,引用DAL并不是那么糟糕的做法。 当我们谈到依赖关系时,应该绘制一行。对我来说,当我们讨论依赖关系并不重要的是dll引用,而是使用的类型(接口或具体)。如你所知,DI取决于具有实际价值的抽象。所以你的代码仍然可以,只要你只依赖于DAL中的接口。

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

关于您的问题,了解图层应如何解决其依赖关系。我不确定这是不是你的意思,但是在DDD中你可以练习你的BLL来定义它自己的层中的基础设施接口(比如存储库)。这种方式依赖图是值得尊敬的。现在,基础设施层(DAL)只定义了BLL提供的接口的具体实现,并且在组合根目录中一切都是有线的。

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

第二种方法是DDD最重要的是域名,所以一切都适用于域名。根据我的经验,在域周围具有结构良好的层是最佳选择。这个apporach使您的代码更明确地解决您为域解决的问题。 我不知道自己是否表达了我的自我。

作为最终说明,如果将此作为学习经验使用,我会建议您使用DDD方法。学习新东西是最好的选择。

我不是该领域最有经验的人。 我是程序员大约3年,主要从事中型项目,所以我的意见并不牢固;]

答案 1 :(得分:1)

自从我读到这篇文章以来,我一直在使用这种方法完成所有项目。强烈建议逐步理解“组合根”。

http://www.dotnetcurry.com/aspnet-mvc/829/dependency-injection-ninject-aspnet-mvc