【发布时间】:2016-03-03 15:45:43
【问题描述】:
我有一个 asp.net web api 应用程序,它使用来自 MS Unity.AspNet.WebApi 和 Unity nuget 包的 Unity 依赖注入库。此外,该应用程序为 ORM 和通用存储库使用实体框架版本 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;
}
...
}
【问题讨论】:
标签: asp.net-web-api dependency-injection inversion-of-control unity-container repository-pattern