在多层应用程序(ASP MVC:UI项目,DAL项目)中,我在web.config中注册了组件。
现在我遇到了这个问题:工作单元模式已经实现,我需要获取特定服务的当前实例。服务的注册发生在UI项目中,但我需要在DAL项目中获取此服务的当前实例。我如何获得此参考?
在UI项目中,我已经需要一种方法来解决问题:
container = new WindsorContainer(
new XmlInterpreter(new ConfigResource("castle"))
);
personRepository= container.Resolve<IPersonRepository>();
在DAL项目中使用相同的技术是否可以?如果是,我应该在单独的文件中编写配置,以便所有层(项目)都可以访问它吗?
对不起这个(我认为)天真的问题,但这是我使用Castle的第一个项目,我想我不明白它的大局!
代码段会有很大帮助。
提前致谢!
答案 0 :(得分:1)
简而言之:每个应用程序一个容器实例,一个容器配置,包含应用程序所需的所有组件。如果您需要DAL中的服务,请通过构造函数(如果依赖项需要)或setter(如果依赖项可选)在DAL类中注入相应的服务接口
尽量避免使用静态IoC网关,它隐藏了组件的真正依赖性,并且阻碍了可测试性。
请参阅以下相关问题:
答案 1 :(得分:-3)
看看这个article。它向您展示了如何使用Castle Windsor编写执行依赖项解析的静态类。您应该考虑将此类放在一个单独的项目中,该项目可以从UI和DAL项目中引用,以允许代码重用。正如文章所解释的那样,您的类应该提供一个初始化IoC容器的引导程序工具。在您的情况下,这看起来像:
public static class IoC
{
private WindsorContainer _container;
public static void Initialize()
{
_container = new WindsorContainer(
new XmlInterpreter(new ConfigResource("castle"))
);
}
}
将从UI项目Global.asax文件中的应用程序启动事件调用引导程序。
从容器中获取对象实例的其他方法将按照文章进行。