15

Autofac 有模块,Windsor 有 Installers 和 StructureMap Registries ... 使用 Simple Injector 如何将配置逻辑打包到可重用的类中?

我试过了:

public interface IModule { }

public class FooModule : IModule
{
    public FooModule(SimpleInjector.Container container)
    {
        container.RegisterSingleton<IBar, Bar>();
        container.RegisterSingleton<IFoo, Foo>();
    }
}

我在合成根中使用它:

public static void Main(string[] args)
{
    var container = new SimpleInjector.Container();
    container.RegisterCollection<IModule>(new FooModule(container));
    ...
}

但是,FooModule取决于容器,可能不是一个好的做法......请参阅http://code.google.com/p/autofac/wiki/BestPractices

如果组件依赖于容器,请查看它们如何使用容器来检索服务,并将这些服务添加到组件的(依赖注入的)构造函数参数中。

4

1 回答 1

18

Simple Injector 核心库中故意省略了“模块”功能,但有一个SimpleInjector.Packaging NuGet 包允许您执行此操作。“包装”是 Simple Injector 使用的术语。然而,这个库只不过是一个IPackage接口和两个扩展方法。您可以通过编写如下代码来实现相同的目的:

一袋:

public static class BootstrapperPackage
{
    public static void RegisterServices(Container container)
    {
        container.Register<IBar, Bar>(Lifestyle.Scoped);
        container.Register<IFoo, Foo>(Lifestyle.Singleton);            
    }
}

在您的作文根目录中:

public static void Main(string[] args)
{
    var container = new SimpleInjector.Container();

    BootstrapperPackage.RegisterServices(container);

    ...
}

SimpleInjector.Packaging NuGet 包的不同之处在于,该包为您定义了一个接口,并允许您在一行中动态加载多个包:

public class BusinessLayerPackage : IPackage
{
    public void RegisterServices(Container container)
    {
        container.Register<IBar, Bar>(Lifestyle.Scoped);
        container.Register<IFoo, Foo>(Lifestyle.Singleton);            
    }
}

public static void Main(string[] args)
{
    var container = new SimpleInjector.Container();

    container.RegisterPackages(AppDomain.CurrentDomain.GetAssemblies());
}

但是,如果你真的不需要动态加载,那么使用静态方法(如上所示)是首选,因为它具有以下优点:

  • 使加载模块非常明确和可发现。
  • 可以轻松选择要加载的模块和不加载的模块。
  • 可以轻松地将额外的值传递给RegisterServices方法,例如此类模块所需的配置值。这可以防止模块对配置系统产生硬依赖。

如需更多信息,请阅读内容。

于 2012-01-24T09:09:43.360 回答