gpt4 book ai didi

c# - 在 MVC 4 应用程序中使用 Unity 和 Entity Framework 的最佳实践是什么

转载 作者:太空狗 更新时间:2023-10-30 00:24:49 25 4
gpt4 key购买 nike

我在 MVC 4 应用程序中使用 Entityframework,使用 Unity 进行依赖注入(inject),使用 Automapper 将对象自动映射到 DTO。我从一个问题跑到另一个问题,EF 有时会返回旧数据,所以我认为我的设计不够好。

我有什么:

要在我的 Application_Start 中配置 Unity:

var UnityContainer = UnityConfig.GetConfiguredContainer();
Mapper.Initialize(cfg => cfg.ConstructServicesUsing(type => UnityContainer.Resolve(type)));
UnityContainer.Resolve<AutoMapperConfig>().MapAutoMapper();
...

在 UnityConfig.RegisterTypes 中:

container.RegisterType<IMyContext, MyContext>(new ContainerControlledLifetimeManager())
...

我的存储库使用构造函数依赖注入(inject):

public class MSSQLTenantRepository : IDalTenantRepository
{
private readonly IMyContext _Db;
public MSSQLTenantRepository(IMyContext db)
{
Db = db;
}
...

我的 Controller 也使用构造函数依赖注入(inject):

public class TenantController : Controller
{
private readonly ITenantRepository _TenantRepository;
public TenantController(ITenantRepository tenantRepository,
{
_TenantRepository = tenantRepository;
}
...

自动映射器配置:

public class AutoMapperConfig
{
private readonly ITenantRepository _TenantRepository;
public AutoMapperConfig(ITenantRepository tenantRepository)
{
_TenantRepository = tenantRepository;
}
...

问题:我有时会从第一个请求中获取旧数据。

当我手动更新 de SQL server 中的数据时,EF 的返回对象不反射(reflect)更改

当我尝试不同的选项时,我也遇到了关于多个上下文的错误(由于 Automapper)

我的问题:

  • 使用 Unity、MVC4、EF 6、存储库和 Automapper 的最佳做法是什么?
  • 将代码放在哪里(例如,在 global.asax.c 或 UnityWebApiActivator 的 UnitiConfig.cs 中?
  • 我是否需要显式处理 dbcontext,如果需要:在哪里执行此操作?

关于这个主题有很多说法,但没有涵盖所有内容。

最佳答案

 container.RegisterType<IMyContext, MyContext>(
new ContainerControlledLifetimeManager())

这很糟糕,它使单例脱离了您的上下文。这样一来,不仅多个请求共享相同的上下文,您会冒并发问题的风险,而且这种共享上下文的内存消耗也会不受控制地增长。

相反,您希望有一个“按请求”的生命周期,其中为每个单独的请求建立一个新的上下文:

http://www.wiktorzychla.com/2013/03/unity-and-http-per-request-lifetime.html

public class PerRequestLifetimeManager : LifetimeManager
{
private readonly object key = new object();

public override object GetValue()
{
if (HttpContext.Current != null &&
HttpContext.Current.Items.Contains(key))
return HttpContext.Current.Items[key];
else
return null;
}

public override void RemoveValue()
{
if (HttpContext.Current != null)
HttpContext.Current.Items.Remove(key);
}

public override void SetValue(object newValue)
{
if (HttpContext.Current != null)
HttpContext.Current.Items[key] = newValue;
}
}

container.RegisterType<IMyContext, MyContext>(new PerRequestLifetimeManager())

我不确定您的 AutoMapperConfig 类的作用以及为什么将存储库注入(inject)其中。这可能是另一个终身问题,但我需要对此进行澄清。

关于c# - 在 MVC 4 应用程序中使用 Unity 和 Entity Framework 的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21380812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com