是否有可能有温莎城堡resolve属性的依赖关系,当你没有在容器上的参考?(Is it possib

2019-07-28 22:10发布

我们有蒙山代表我们的应用程序层中的多个项目的解决方案。 例如

数据

逻辑

WebUI中

我们的温莎城堡容器从我们的网络层引用然后我们通过我们的层高达级联这些依赖关系。 例如...

// 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();

这很好地工作,直到我们的管理者有很多有自己的依赖关系的成员。 发生这种情况时,我们结束了resolveing无论是管理者依赖关系和他们的依赖关系depandancies和从网络层级联起来。 这导致一些相当大的构造。

有,例如有一个经理的内部部件更优雅的方式解决它自己的依赖关系,而无需进入容器?

请记住,只有Web层到容器(防止圆形项目扶养)的访问,所以只能在网络层可以activly WindsorContainer.Resolve()逻辑层不能所以唯一的办法级联一个无扶养的集装箱援助来解决它在网络层,然后使用它的界面通过它的链条。

Answer 1:

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

在你的情况,你会走了(从对象树MyThingyManager直到你得到根对象)。 例如,在一个ASP.NET MVC应用程序,这将是包含被调用的动作控制器。 对于MVC3情况下,你可以使用一个DependencyResolver揭开序幕所有依赖的注入。

此外,我已经在过去发现有用与温莎是具有每组分(组件)不同的安装程序。 然后在承载应用程序的进程的基址寄存器这些安装程序。

因此,在每个组件,你将有一个安装程序,如:

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)));

这给你一个方法来管理所有的依赖关系了整个对象图,并通过构造函数注入解决。 希望这可以帮助。



文章来源: Is it possible to have Castle Windsor resolve property dependancies when you dont have a reference to the container?