如何在温莎城堡获得服务实例

时间:2009-11-07 23:15:36

标签: castle-windsor

在多层应用程序(ASP MVC:UI项目,DAL项目)中,我在web.config中注册了组件。

现在我遇到了这个问题:工作单元模式已经实现,我需要获取特定服务的当前实例。服务的注册发生在UI项目中,但我需要在DAL项目中获取此服务的当前实例。我如何获得此参考?

在UI项目中,我已经需要一种方法来解决问题:

container = new WindsorContainer(
                new XmlInterpreter(new ConfigResource("castle"))
            );
            personRepository= container.Resolve<IPersonRepository>();

在DAL项目中使用相同的技术是否可以?如果是,我应该在单独的文件中编写配置,以便所有层(项目)都可以访问它吗?

对不起这个(我认为)天真的问题,但这是我使用Castle的第一个项目,我想我不明白它的大局!

代码段会有很大帮助。

提前致谢!

2 个答案:

答案 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文件中的应用程序启动事件调用引导程序。

从容器中获取对象实例的其他方法将按照文章进行。