我有一个有两个项目的解决方案: MVC 和 Business
从Castle Windsor: Register components across multiple projects in solution我可以看出所有管道都应该在MVC层中,所以我创建了一个IoC容器(在MVC中):
public static class IocContainer
{
private static IWindsorContainer _container;
public static void Setup()
{
_container = new WindsorContainer().Install(FromAssembly.This());
}
public static T Resolve<T>()
{
return _container.Resolve<T>();
}
}
我还在MVC项目中创建了一个安装程序:
public class BusinessLogicInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IBusinessFacade>()
.ImplementedBy<BusinessFacade>()
.LifestylePerWebRequest());
}
}
由于intaller知道具体的BusinessFacade类型,MVC依赖于Business层(BusinessFacade类所在的位置)。
因为我还想在业务层使用DI,我如何从Business项目访问IoC容器,而不创建与MVC和Business的循环依赖?
答案 0 :(得分:1)
在应用程序启动时查看bin文件夹中的所有程序集以查找实现IWindsorInstaller的类型,并运行它们的install方法,传入容器的应用程序级实例(在这种情况下,这是容器包装类中的私有容器)
您通常不应手动解决,应该连接您的应用程序以自动注入您的控制器。如果您必须手动解决,请在控制器级别的每个请求中执行一次。
如果您手动解决所有代码,那么您正在使用服务定位器模式,这是不好的。