我有一个具有典型架构的MVC应用程序..。
ASP.NET MVC控制器-> Person Service -> Person Repository ->实体框架DB上下文
我正在使用Castle,我可以看到与ControllerFactory一起使用它来创建具有正确依赖关系的控制器的好处。使用这种方法,Controller将得到一个服务注入,该服务知道如何构造正确的存储库,而后者又知道要使用的正确的DbContext。
温莎配置是这样的。
dicontainer = new WindsorContainer();
dicontainer.Register(Component.For<IPersonService>().ImplementedBy<PersonService>());
dicontainer.Register(
Component.For<IPersonRepository>().UsingFactoryMethod(
() => new PersonRepository(new HrContext("connectionString"))));这样做是对的吗?我不喜欢UsingFactoryMethod,但我想不出别的办法。
另外,如果存储库需要服务层不需要的依赖项(比如ILogger),该怎么办?这是否意味着我必须将ILogger传递到服务层而不是使用它。这似乎是个糟糕的设计。我希望你能给我一些建议。我阅读了大量的文章,但没有找到一个具体的例子来验证我是否做得对。谢谢。
发布于 2012-11-08 00:05:05
我尽量避免使用工厂的方法(正如你提到的,你觉得这闻起来很好笑)。为了避免这种情况,您可以创建一个创建新DbContext的数据库会话对象。然后,您的存储库只需获取IDbSession的一个实例并使用其dbContext属性即可。然后,您还可以轻松地控制IDbSession对象的作用域(不要使用单例,因为它不是线程安全的)。
我想说明这一点这样我才能提出更重要的观点..。使构造函数只接受在DI容器中注册的对象(在构造函数中没有选项或配置)。选项和配置应该在类中进行读/写,其唯一目的是读取/写入这些值。如果所有类都遵循这个模型,那么DI注册就变得容易了,类只需在构造函数中添加所需的依赖项即可。
如果试图使用在构造函数中有选项的第三方库,请将该类包装在自己的类中,该类具有易于使用的构造函数,并使用配置类读取传递给第三方库所需的值。此设计还在代码和第三方库之间引入了抽象层,然后在必要时可以更容易地交换(或存根)第三方库。
https://stackoverflow.com/questions/13279088
复制相似问题