如何在解决方案中将 Castle Windsor 与多个项目一起使用
How to use Castle Windsor with multiple projects in a solution
我有一个解决方案,它有两个项目: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());
}
}
由于安装者知道具体的 BusinessFacade 类型,因此 MVC 依赖于业务层(BusinessFacade class 所在的层)。
因为我还想在业务层使用 DI,我如何从业务项目访问 IoC 容器,而不创建与 MVC 和业务的循环依赖?
在应用程序启动时在 bin 文件夹中的所有程序集中查找实现 IWindsorInstaller 的类型,以及 运行 它们的安装方法,传入容器的应用程序级实例(在本例中是您的私有容器在你的容器包装器中 class).
您通常不应手动解析,而应连接您的应用程序以自动注入您的控制器。如果您必须手动解决,请在控制器级别针对每个请求执行一次。
如果您在整个代码中手动解析,则您使用的是服务定位器模式,这很糟糕。
我有一个解决方案,它有两个项目: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());
}
}
由于安装者知道具体的 BusinessFacade 类型,因此 MVC 依赖于业务层(BusinessFacade class 所在的层)。
因为我还想在业务层使用 DI,我如何从业务项目访问 IoC 容器,而不创建与 MVC 和业务的循环依赖?
在应用程序启动时在 bin 文件夹中的所有程序集中查找实现 IWindsorInstaller 的类型,以及 运行 它们的安装方法,传入容器的应用程序级实例(在本例中是您的私有容器在你的容器包装器中 class).
您通常不应手动解析,而应连接您的应用程序以自动注入您的控制器。如果您必须手动解决,请在控制器级别针对每个请求执行一次。
如果您在整个代码中手动解析,则您使用的是服务定位器模式,这很糟糕。