- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个三层应用程序。每个部分都依赖于我的解决方案的另一部分。我曾经在 MVC 项目中实现 IDependencyResolver
。这是一种错误的方式,因为它会导致违反分层的架构规则。我的 MVC 项目引用了 DAL 层。这是一种糟糕的编码习惯。我知道我可以创建一个单独的类库项目。它将引用我的解决方案的任何其他项目。它将解决所有依赖关系。我听说这不是最好的方法。有一个更好的办法。我的解决方案的每个项目都应该解决它拥有的依赖项。我不明白如何把它们放在一起。所以我找到了这篇有用的文章:Dependency Injection Best Practices in an N-tier Modular Application但它似乎太困难和复杂了。还有别的办法吗?我有类似的解决方案结构。 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
}
}
最后 UserController
构造函数可能有很多不同的依赖项。
我的问题是什么是解决这些依赖关系并避免违反架构规则的最正确和最简单的方法?
最佳答案
就像你说的,你可以创建额外的层来组合依赖关系,这叫做组合根Check this SO question .在您的情况下,组合根是 MVC 项目。 从我的角度来看,引用 DAL 并不是什么坏习惯。 当我们谈到依赖关系时,应该划清界线。对我来说,当我们谈论依赖关系时,dll 引用并不重要,而是使用的类型(接口(interface)或具体)。如您所知,DI 依赖于具有实际值(value)的抽象。所以你的代码仍然可以,只要你只依赖于 DAL 中的接口(interface)。
在实践中,当 dll 依赖关系变得过于复杂时,我使用了额外的项目作为组合根。
关于您的问题,层应该如何解决它们的依赖关系。我不确定这是否是你的意思,但在 DDD 中有练习你的 BLL 在它自己的层中定义基础设施接口(interface)(如存储库)。这样,依赖图就受到了尊重。现在,基础结构层 (DAL) 您只需定义 BLL 提供的接口(interface)的具体实现,并且在组合根中再次连接所有内容。
第一种方法,其中基础架构层定义接口(interface)和实现,具有无依赖性的优势,适合跨不同项目重用。但请记住,在大领域工作时,这有时可能会导致代码无法维护。
第二种方法 作为 DDD 最重要的是领域,所以一切都适用于领域。根据我的经验,在域周围拥有结构良好的层是最好的选择。此方法使您的代码更明确地说明您为域解决的问题。我不知道我是否正确地表达了自己。
作为最后的说明,如果只是将其用作学习经验,我会建议您使用 DDD 方法。学习新东西是最好的选择。
我不是该领域最有经验的人。我是大约 3 年的程序员,主要从事中型项目,所以我的意见并不可靠;]
关于c# - 如何在N层应用中实现IDependencyResolver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42274352/
我正在设计对遗留 ASP.NET 应用程序的一些架构更改。我为模仿 ASP.NET MVC 的 IDependencyResolver 的依赖关系解析制作了一些类的原型(prototype)。我不会发
我有一点误解:当我们实现 IDependencyResolver 时,这意味着我们可以在项目的每个部分使用 DI。因此,即使我不从 DefaultControllerFactory 继承,我也可以构建
为什么 IDependencyResolver 与 System.Web 程序集(Mvc 或 Http ) 在 .NET 框架中? DI 系统的目标不是应该提供一种不可知的方式来为客户提供依赖项吗?如
我正在开发一个 Web Api,我决定使用自定义 DependencyResolver。我引用 this [Dependency Injection for Web API Controllers]文
我在 MVC(基础书籍)中阅读了有关 IDependencyResolver 的内容,但我不知道 mvc 中的 DependencyResolver 到底是什么? 有人可以解释一下这些方法吗? 最佳答
我在 MVC(基础书籍)中阅读了有关 IDependencyResolver 的内容,但我不知道 mvc 中的 DependencyResolver 到底是什么? 有人可以解释一下这些方法吗? 最佳答
我们可以通过实现 IDependencyResolver 或扩展 DefaultControllerFactory 在 MVC 中进行 DI 我之前一直认为这两种不同的方式做起来没有太大的区别。 然而
各位! 我在使用 MVC3 IDependencyResolver 从 Unity 2.0 解析命名注册时遇到问题。 我将类型注册配置为 public class Implementations {
最近我遇到了这个讨论。 在 ASP.NET WebAPI 中,当我们需要集成自定义控制反转/依赖注入(inject)容器时,我们需要采用两种不同的策略: 实现 IHttpControllerActiv
在使用 Unity 进行依赖注入(inject)时,我对 MVC 的 IDependencyResolver.GetServices 的实现有疑问。 可以找到几个示例实现,其中大部分已经实现以解决 U
我正在尝试使用 HttpSelfHostServer 自托管 ASP.NET MVC 4 WebAPI。一切都很好,我尝试添加自定义依赖解析器。 (最终这将使用 StructureMap,但我还没有达
我读了 this article看到很多人评论说不要使用 CaSTLe Windsor 在 ASP.NET MVC3 中实现 IDependencyResolver 并坚持使用自定义 IControl
我是一名优秀的程序员,十分优秀!