如何在解决方案中将 Castle Windsor 与多个项目一起使用

How to use Castle Windsor with multiple projects in a solution

我有一个解决方案,它有两个项目:MVCBusiness

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

您通常不应手动解析,而应连接您的应用程序以自动注入您的控制器。如果您必须手动解决,请在控制器级别针对每个请求执行一次。

如果您在整个代码中手动解析,则您使用的是服务定位器模式,这很糟糕。