加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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的每个请求创建新实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读