asp.net-web-api – 我是否使用正确的终身经理进行依赖注入?
发布时间:2020-12-16 07:20:32 所属栏目:asp.Net 来源:网络整理
导读:我有一个asp.net web api应用程序,它使用来自MS Unity.AspNet.WebApi和Unity nuget包的Unity依赖注入库.此外,该应用程序使用ORM的Entity Framework版本6数据库上下文和通用存储库. Api控制器使用自定义服务类型.自定义服务类使用EF数据库上下文和通用存储库.
我有一个asp.net web api应用程序,它使用来自MS Unity.AspNet.WebApi和Unity nuget包的Unity依赖注入库.此外,该应用程序使用ORM的Entity Framework版本6数据库上下文和通用存储库.
Api控制器使用自定义服务类型.自定义服务类使用EF数据库上下文和通用存储库. 我的问题是:HierarchicalLifetimeManager和ContainerControlledLifetimeManager是否适用于我的web api应用程序的终身管理器? 我的应用程序的UnityConfig类中的代码: using System; using System.Configuration; using System.Data.Entity; using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.Configuration; using App.Api.Models; using App.Dal; public class UnityConfig { #region Unity Container private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() => { var container = new UnityContainer(); RegisterTypes(container); return container; }); /// <summary> /// Gets the configured Unity container. /// </summary> public static IUnityContainer GetConfiguredContainer() { return container.Value; } #endregion /// <summary>Registers the type mappings with the Unity container.</summary> /// <param name="container">The unity container to configure.</param> /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to /// change the defaults),as Unity allows resolving a concrete type even if it was not previously registered.</remarks> public static void RegisterTypes(IUnityContainer container) { var connectionStringEntityFramework= ConfigurationManager.ConnectionStrings["AppEntities"].ToString(); // Entity Framework database context and generic repository // HierarchicalLifetimeManager is used: container.RegisterType<DbContext,FirstAngularJsEntities>(new HierarchicalLifetimeManager(),new InjectionConstructor(connectionStringFirstAngularJsEntities)); container.RegisterType<IRepository,GenRepository>(new HierarchicalLifetimeManager(),new InjectionConstructor(typeof(DbContext))); // services // ContainerControlledLifetimeManager is used: container.RegisterType<IContactService,ContactService>(new ContainerControlledLifetimeManager()); container.RegisterType<IProductService,ProductService>(new ContainerControlledLifetimeManager()); } 示例api控制器在其构造函数中注入了自定义服务: public class ContactApiController : ApiController { private readonly IContactService _contactService; public ContactApiController(IContactService contactService) { _contactService = contactService; } ... } 示例自定义服务在其构造函数中注入了EF DbContext和存储库: public class ContactService : IContactService { private readonly IRepository _repo; private readonly DbContext _context; public ContactService(DbContext context,IRepository repo) { _context = context; _repo = repo; } ... } 解决方法
使用ContainerControlledLifetimeManager,您将获得服务的单件.一个实例很长一段时间(直到IIS回收).
HierarchicalLifetimeManager与子容器一起使用 – 为每个子容器创建对象的新实例,因此您不创建子容器,它再次像单例一样工作:) WebApi应用程序的最佳方法是使用 PerRequestLifetimeManager . 为Api的每个请求创建新实例.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – DataBinding Eval到2个小数位置不显示0
- 从ASP.net VB中的子页面访问母版页属性
- 为Asp.Net MVC中的特定Controller或Action启用SSL客户端证书
- iis-7.5 – ASP.NET 5将应用程序添加为IIS应用程序
- asp.net core 3.0 gRPC框架小试
- asp.net-mvc – 使用ASP.NET Identity 2.0 UserManagerFact
- asp.net-mvc – 有没有办法让RoutePrefix以可选参数开头?
- asp.net RijndaelManaged类属性的默认值是什么
- asp.net-mvc – ASP.NET MVC 3多语言SEO
- asp.net – 无法加载文件或程序集“Microsoft.Web.Extensio
推荐文章
站长推荐
- asp.net中的pagemethods
- asp.net – Telerik RadGrid GridDataItem – 如
- 选择List返回System.Data.Entity.DynamixProxies
- asp.net – 我可以通过编程方式禁用更新面板吗?
- asp.net – 设置.net web-application的默认页面
- asp.net – 将Dot Net网站调试为域普通用户
- asp.net-mvc – 不要在ASP .NET MVC 4 BundleCon
- asp.net – 线程安全和MEF目录
- asp.net-core – ASP .NET Core 1.0 RTM本地化无
- asp.net-mvc – 在asp.NET MVC 3中响应HEAD请求
热点阅读