一直以来,我一直在为此付出努力,所以我开始认为自己创建了一个反模式。尽管如此,DI创建模式
//Register self
container.Register(Component.For<IWindsorContainer>().Instance(container));
//Register all
container.Register(Component.For<IService1>().ImplementedBy<Service1>());
container.Register(Component.For<IService2>().ImplementedBy<Service2>());
//etc
IService1
{
//blabla
}
IService2 {IService1 Service1{get;}}
因此IService1和IService2可以创建没有任何特殊的。 从IService3开始,涉及IProject。
IProject{}
//Resolve a service that, amongst other things, relies on an IProject
IProjectGet
{
T Get<T>(IProject proj)
where T : class;
}
//Impl
ProjectGet : IProjectGet
{
IWindsorContainer _cont;
public ProjectGet(IWindsorContainer cont){_cont=cont}
public T Get<T>(IProject proj)
{
//Resolve using the main (and only) container and pass the IProject
return _cont.Resolve<T>(new {p = proj});
}
}
这是不行的,只有主服务与 “P =凸出”和任何其他依赖的主要服务有,这也依赖于该项目解决了, 导致异常话说项目服务没找到。
IService3
{
IService2 Service2{get;}
IProjectGet ProjectGet{get;}
IProjectLevelStuff SetActiveProject(IProject proj);
}
Service3 : IService3
{
IService2 Service2{get;private set;}
IProjectGet ProjectGet{get;private set;}
public Service3(IService2 s2, IProjectGet p)
{
ProjectGet = p;
Service2 = s2;
}
public IProjectLevelStuff SetActiveProject(IProject proj)
{
return ProjectGet.Get<IProjectLevelStuff>(proj);
}
}
ProjectLevelStuff : IProjectLevelStuff
{
IProject Project{get;private set;}
IService4 Service4 {get;private set;}
public ProjectLevelStuff(IProject p, IService4)//etc.
}
IService4
{
IService2 Service2{get;}
IService5 Service5{get;}
IService6 Service6{get;}
IProject Project{get;}
}
IService5{IProject Project{get;}}
IService6{IProject Project{get;}}
失败的原因只有ProjectLevelStuff得到的IProject传递给它,并自IService4和它的依赖也需要它,则抛出异常。即使这确实起作用,我也不喜欢它,因为每个依赖IProject的服务都被迫调用我想避免的那个参数'p'。
我只想继续使用我已经拥有的服务,但是这次添加了作为可解析依赖项传递给我们的通用Get方法的IProject实例。我找不到任何方法来复制容器并创建一个新的容器,然后添加主容器作为一个小孩不会改变任何东西(依赖项仍然丢失)。这是如何完成的?
温莎城堡确实有一个TypeFactory内置,但它基本上做同样的事情,我已经做了什么,并没有解决任何问题。我发现唯一的'解决方案'是创建一个新的容器并重新注册类型,但这次通过主容器解决它们(当然除了IProject)..这是作品中的维护噩梦。
更新:我添加了一些单元测试,以低于希望澄清了一些事情
你好Natli,这是一个非常糟糕的想法通过容器内的容器。也许如果你尝试用TypedFactory重写代码,其他人可能会更容易帮助你。目前的代码对我来说很复杂,但看起来你需要一种束缚或范围的生活方式。 – Marwijn 2013-04-25 07:34:09
@Marwijn嘿,我已经达到了一个非常不满意的解决方案,但我会添加它作为答案,希望能够澄清一些混淆。 – natli 2013-04-25 13:46:40