首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖注入-向下传递依赖项

依赖注入-向下传递依赖项
EN

Stack Overflow用户
提问于 2012-11-07 22:05:58
回答 1查看 214关注 0票数 0

我有一个具有典型架构的MVC应用程序..。

ASP.NET MVC控制器-> Person Service -> Person Repository ->实体框架DB上下文

我正在使用Castle,我可以看到与ControllerFactory一起使用它来创建具有正确依赖关系的控制器的好处。使用这种方法,Controller将得到一个服务注入,该服务知道如何构造正确的存储库,而后者又知道要使用的正确的DbContext。

温莎配置是这样的。

代码语言:javascript
复制
dicontainer = new WindsorContainer();
dicontainer.Register(Component.For<IPersonService>().ImplementedBy<PersonService>());
dicontainer.Register(
    Component.For<IPersonRepository>().UsingFactoryMethod(
        () => new PersonRepository(new HrContext("connectionString"))));

这样做是对的吗?我不喜欢UsingFactoryMethod,但我想不出别的办法。

另外,如果存储库需要服务层不需要的依赖项(比如ILogger),该怎么办?这是否意味着我必须将ILogger传递到服务层而不是使用它。这似乎是个糟糕的设计。我希望你能给我一些建议。我阅读了大量的文章,但没有找到一个具体的例子来验证我是否做得对。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-08 00:05:05

我尽量避免使用工厂的方法(正如你提到的,你觉得这闻起来很好笑)。为了避免这种情况,您可以创建一个创建新DbContext的数据库会话对象。然后,您的存储库只需获取IDbSession的一个实例并使用其dbContext属性即可。然后,您还可以轻松地控制IDbSession对象的作用域(不要使用单例,因为它不是线程安全的)。

我想说明这一点这样我才能提出更重要的观点..。使构造函数只接受在DI容器中注册的对象(在构造函数中没有选项或配置)。选项和配置应该在类中进行读/写,其唯一目的是读取/写入这些值。如果所有类都遵循这个模型,那么DI注册就变得容易了,类只需在构造函数中添加所需的依赖项即可。

如果试图使用在构造函数中有选项的第三方库,请将该类包装在自己的类中,该类具有易于使用的构造函数,并使用配置类读取传递给第三方库所需的值。此设计还在代码和第三方库之间引入了抽象层,然后在必要时可以更容易地交换(或存根)第三方库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13279088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档