2009-11-07 81 views
0

在多层应用程序(ASP MVC:UI项目,DAL项目)中,我在web.config中注册了组件。如何获得温莎城堡的服务实例

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

在UI项目我已经需要一种方式来得到的东西解决:

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

难道即可使用的DAL项目相同的技术?如果是,我应该将配置写入单独的文件中,以便可以通过所有图层(项目)访问它?

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

代码片段会有很大的帮助。

在此先感谢!

回答

1

简而言之:每个应用程序都有一个容器实例,一个容器配置具有应用程序所需的所有组件。如果您需要DAL中的服务,请通过构造函数(如果依赖项为需要)或setter(如果依赖项为可选)在DAL类中注入适当的服务接口。

尽量避免使用静态IoC网关,它隐藏了组件的真正依赖关系并且妨碍了可测试性。

看到这些相关的问题:

+0

我明白你的意思了! 但我不明白的是:这应该怎么做! DAL是它自己的一个组合。在它的一个类中,我简单地使用(IWindsorContainer容器)作为构造函数参数?如果是的话,我不需要注册容器本身(在UI项目中)?怎么样? 或者可以(应该)使用这样的东西: WindsorContainer container = new WindsorContainer(); container.Resolve (); 这意味着没有构造函数注入。 ...想我不明白如何做到这一点的技巧! – 2009-11-08 22:06:52

+0

不,*避免*直接调用容器。不管它是否是另一个程序集,它仍然是同一个应用程序。使用此项目作为参考:http://code.google.com/p/blogsharp/ – 2009-11-09 01:37:53

-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文件被调用。

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

+2

请不建议这样做。静态IoC网关是在IoC恶意环境中获得IoC功能的**最后一个资源。应该鼓励定期的DI实践。 – 2009-11-08 15:16:28