繁体   English   中英

在SimpleInjector中用构造函数注册泛型类型如何?

[英]Register generic types with constructor in SimpleInjector how?

我使用Microsoft Unity作为IoC容器,并编写了如下代码:

public static void RegisterTypes(IUnityContainer container)
{
    MyContext ctx = new MyContext (); // is EntityFramework DbContext
    container.RegisterType(typeof(IEntityRepository<>),
                           typeof(EntityRepository<>), 
                           new InjectionConstructor(ctx));
    container.RegisterType(typeof(IEntityService<>), 
                           typeof(EntityService<>));
}

它对我来说毫无问题,但我想知道如何在SimpleInjector中编写等效

您的配置没有什么特别的,@ Patryk在这里为您提供了正确的文档。 Simple Injector将为您完成自动装配,因此您不必显式指定构造函数参数。

但是,您当前的设置DbContext ,因为您的DbContext似乎是单身。 在整个应用程序期间,您只有一个实例。 在几乎所有情况下,这都是一个非常糟糕的主意 您的应用程序可以生存很长时间(例如Windows服务),也可以同时处理许多线程(例如ASP.NET和WCF)。 仅在您的单线程应用程序寿命很短的情况下(例如控制台应用程序),您才可能只有一个DbContext。 您不想将DbContext注册为单例。

但是,也许这不是单例,您实际上每个请求调用一次此RegisterTypes 在这种情况下,每个请求将有一个DbContext,但这意味着您将为每个请求创建一个新的容器实例,这也很糟糕。 这对于Unity和Simple Injector的性能都非常不利。 DI库经过特别优化,可在应用程序期间具有一个单个容器实例。

因此,您宁愿在应用程序使用期间拥有一个容器实例,并且通常将DbContext注册为Scoped生活方式。

在Simple Injector中,有多种范围的生活方式 ,每种生活方式都针对所选技术。 假设您正在使用MVC,则您的注册可能如下所示:

public static void RegisterTypes(Container container)
{
    container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();

    container.Register<MyContex>(Lifestyle.Scoped);

    container.Register(typeof(IEntityRepository<>), typeof(EntityRepository<>));

    container.Register(typeof(IEntityService<>), typeof(EntityService<>));
}

请注意EntityRepository<T>的注册。 如果EntityRepository<T>具有MyContext的构造函数参数,并且MyContext已在容器中注册,则Simple Injector将能够在其构造函数中为您注入此依赖项。 此过程称为自动装配,通常应让容器为您完成此操作,因为这会使您的DI配置更易于维护。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM