如何为每个Web请求配置Unity for One DbContext

时间:2014-07-29 19:33:45

标签: entity-framework asp.net-mvc-5 unity-container

我在MVC应用程序中使用EF 6和Unity 3.5。我想知道使用Unity配置DbContext的正确方法是什么。

根据我的理解,这更合适。

container.RegisterType<IdbContext, MyContext>(new PerRequestLifetimeManager());

任何人都可以确认这是否是正确的做法?

假设上面的代码是正确的,如果我在一些ServiceLayer中注入它,我是否需要处理我的上下文?

2 个答案:

答案 0 :(得分:0)

是的,我已经看过很多次了。但是当它在控制器中使用时,请确保覆盖Dispose()方法

答案 1 :(得分:0)

我更喜欢使用构造函数注入

public static class UnityConfig
{
    public static void RegisterComponents()
    {
       var container = new UnityContainer();

       ..... // others

       container.RegisterType<IMyDbContext, MyDbContext>(
        new TransientLifetimeManager(),
        new InjectionConstructor(infConfig.azure.dbConnectionString,
                                           DbValidationMode.Enabled,
                                           DbLazyLoadingMode.Disabled,
                                           DbAutoDetectMode.Enabled));

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);

然后在控制器中我使用

public class HomeController : ApiController (webApi) or Controller (MVC)
{
    IMyDbContext db;

    public HomeController(IMyDbContext db)
    {
        this.db = db;
    }

    [HttpGet]
    public HttpResponseMessage GetSomething()
    {
        var someEntities = db.SomeEntities.ToList();
        ... etc
    }

当请求实例终止时,它将处理您的上下文。它只在你的控制器中有作用域。