[英]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.