加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC DDD应用程序中的组合根

发布时间:2020-12-16 07:05:32 所属栏目:asp.Net 来源:网络整理
导读:我正在阅读Mark Seemann目前的“.NET中的依赖注入”.我想知道组成DDD ASP.NET MVC应用程序的最佳方法是什么. 在简化的场景中,一般的经验法则是将域模型作为应用程序的核心,并且不会对数据层或表示有任何依赖性.它将暴露Presentation将使用的某些接口(因此依
我正在阅读Mark Seemann目前的“.NET中的依赖注入”.我想知道组成DDD ASP.NET MVC应用程序的最佳方法是什么.

在简化的场景中,一般的经验法则是将域模型作为应用程序的核心,并且不会对数据层或表示有任何依赖性.它将暴露Presentation将使用的某些接口(因此依赖)和数据层将实现(因此依赖).所以这一切都很好而且清晰.

但是,现在,当我们撰写应用程序时.对于ASP.NET MVC应用程序,我们将在global.asax(http://blog.ploeh.dk/2011/07/28/CompositionRoot)中进行.我们的组合根将需要依赖所有层,因为它需要注册所有适用的类型.

这使得所有依赖项看起来都很混乱,现在Presentation层有一个对数据访问层的项目引用(在VS术语中).开发人员很容易犯错并直接使用数据形式的数据访问层,这将有效地耦合这些层.

有没有一个干净的方法来解决这个难题?将Composition Root放在表示层之外几乎是很好的,但在MVC中是不可能的.

UPDATE

在问这个问题后,我发现了一个相关的问题:
DAL -> BLL <- GUI + composition root. How to setup DI-bindings?
它有一些有意义的解决方案.接受的解决方案几乎是完美的,但我希望组合根在表示层之外,并且参考表示层而不是其他方式.

其中一个原因是,对我来说概念更清晰 – 构图应该在最顶层.另一个原因是,在我的情况下,表示层中已经有许多DI对象(主要是查看模型映射器的域对象),我想将它们组合在一个位置.

这个帖子给了我一些想法,我认为我想做的事情可能是可能的.

解决方法

It is easy for a developer to make a mistake and use types form Data Access layer directly,which would effectively couple those layers.

无论你如何阻止它,很容易做很多愚蠢的事情.不要在开发人员不做之后为您的应用程序建模.对它进行建模,以便正确地完成任务.

he accepted solution is almost perfect,however I would like the
composition root to be outside of presentation layer,and reference
presentation layer rather than the other way.

我的容器支持您的要求.在每个项目中创建一个模块,用于注册其他所有内容:

public class CompositionRoot : IContainerModule
{
    public void Register(IContainerRegistrar registrar)
    {
        registrar.RegisterType<ISomeType,SomeType>();
    }
}

在您的UI项目中,您只需加载所有dll:

registrar.RegisterModules(Lifetime.Scoped,Environment.CurrentDirectory,"myproject.*.dll");

就是这样(如果使用[Component]属性标记实现,也可以用一行替换大多数手动RegisterType等).

https://github.com/jgauffin/griffin.container

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读