5

我们有一个解决方案,其中包含多个代表我们应用程序层的项目。例如

领域

数据

逻辑

网页界面

我们的 Castle Windsor 容器是从我们的 Web 层引用的,然后我们将这些依赖关系通过我们的层级联起来。例如...

// In Domain
public interface IFooRepository
{
    void DoSomething();
} 

// In Data
public class FooRepository : IFooRepository
{
    public void DoSomething()
    {
        // Something is done
    }
}

// In Logic
public class MyThingManager
{
    private readonly IFooRepository fooRepository;

    public MyThingManager(IFooRepository fooRepository)
    {
        this.fooRepository = fooRepository;
    }

    public void AMethod()
    {
        this.fooRepository.DoSomething();
    }

}

// In Web
// in some controller....
var newManager = new MyThingManager(WindsorContainer.Resolve<IFooRepository>());
newManager.DoSomething();

这很好用,直到我们的经理有很多成员都有自己的依赖关系。当这种情况发生时,我们最终解决了管理器的依赖关系及其依赖关系,并将它们从 Web 层级联起来。这个结果是一些相当大的构造函数。

有没有更优雅的方式,例如让管理器的内部组件解决它自己的依赖关系而无需访问容器?

请记住,只有 web 层可以访问容器(以防止循环项目依赖),所以只有 web 层可以激活 WindsorContainer.Resolve() 逻辑层不能,所以只有在没有容器的帮助是在 web 层解决它,然后使用它的接口将它传递到链上。

4

1 回答 1

6

简短的回答是,每当你看到.Resolve<T>你可能做错了。正如@Steven 提到的,您想使用 Windsor 的内置功能为您提供构造函数注入(和/或属性注入)。这意味着WindsorContainer需要知道位于对象图根的对象。

在您的情况下,您将沿着对象树(从MyThingyManager)向上走,直到到达根对象。例如,在 ASP.NET MVC 应用程序中,这将是包含被调用操作的控制器。对于 MVC3 案例,您将使用DependencyResolver来启动所有依赖项的注入。

此外,我发现过去对 Windsor 有用的是每个组件(组件)有一个不同的安装程序。然后在托管应用程序的进程的基础上注册这些安装程序。

因此,在每个组件中,您都会有一个安装程序,例如:

public class Installer : IWindsorInstaller
{
        public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
        {
            container.Register(
                Component.For<IMyThingManager>().ImplementedBy<MyThingManager>(),
                Component.For<IFooRepository>().ImplementedBy<FooRepository>()
                );
        }
}

然后在 Global.asax.cs Application_Start 你会有类似的东西:

var container = new WindsorContainer();
container.Install(FromAssembly.This());
container.Install(FromAssembly.Containing(typeof(ComponentThatContains.MyThingManager.Installer)));

这为您提供了一种管理整个对象图中的所有依赖项并通过构造函数注入解决的方法。希望这可以帮助。

于 2012-04-11T11:48:11.890 回答