Я начинаю с готовой установки MVC5 и Unity как контейнера IoC.
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using System;
using System.Data.Entity;
using System.Web;
using DemoAPI.Repository;
using DemoMVC.Controllers;
using DemoMVC.Models;
using Unity;
using Unity.AspNet.Mvc;
using Unity.Injection;
using Unity.Lifetime;
namespace DemoMVC
{
/// <summary>
/// Specifies the Unity configuration for the main container.
/// </summary>
public static class UnityConfig
{
#region Unity Container
private static Lazy<IUnityContainer> container =
new Lazy<IUnityContainer>(() =>
{
var container = new UnityContainer();
RegisterTypes(container);
return container;
});
/// <summary>
/// Configured Unity Container.
/// </summary>
public static IUnityContainer Container => 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)
{
container.RegisterType<IRepository, DemoRepository>();
#region OWIN
container.RegisterType<AccountController>(new InjectionConstructor());
container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>,
UserStore<ApplicationUser>>(new PerRequestLifetimeManager());
container.RegisterType<ApplicationUserManager>(new PerRequestLifetimeManager());
container.RegisterType<IAuthenticationManager>(
new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication));
container.RegisterType<ApplicationSignInManager>(new PerRequestLifetimeManager());
#endregion
}
}
}
У меня есть одно серьезное беспокойство: регистрация ApplicationDbContext с помощью иерархического менеджера времени жизни.Регистрация DbContext вручную и использование этого экземпляра при регистрации остальных типов - кажется сомнительным использование того же вечного контекста БД для ВСЕХ запросов.Однако каждый запрос имеет для меня еще меньше смысла, поскольку кажется, что создание экземпляра dbContext для каждого запроса требует огромной траты ресурсов.
Есть ли другой / лучший способ сделать это, которого я мог бы упустить?Я пытался найти документы на предмет единства и, в особенности, пожизненных менеджеров, но все, что я мог найти, кажется довольно устаревшим.