gpt4 book ai didi

c# - Entity Framework 自跟踪实体和 ASP MVC .NET 和托管扩展框架的问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:23 25 4
gpt4 key购买 nike

大修改:这个问题可能是由 MEF 引起的!

我正在使用面向服务的架构,并让我所有的 MVC Controller 通过服务执行操作。

我有一个如下所示的基本服务:

public abstract class BaseService
{
protected MyObjectModel context;

public BaseService()
{
context = new MyObjectModel();
}
}

然后我有继承的服务

[Export(typeof(IEmployeeService))]    
public class EmployeeService : BaseService, IEmployeeService
{
public void NewEmployee(Employee newEmployee)
{
context.Employees.AddObject(newEmployee);
context.SaveChanges();
}
}

我的 Controller 也继承自一个基类,该基类提供对所有必需服务的访问,因此它们可以调用:

EmployeeService.AddEmployee(new Employee() { Name = "JohnDoe"});

这一切都非常有效,直到我开始发现 ObjectContext 在构建时没有准确反射(reflect)数据库。

我在 BaseService 构造函数中放置了一个断点,并使用 Sql Server 的 Profiler 发现全新的 MyObjectModel 甚至没有访问数据库,而是大概从某个缓存中提取数据?

我在上下文中偶然发现了集合的 MergeOption 属性并进行了更改以确保数据是最新的,但现在我每次创建返回实体的新服务方法时都需要使用它!

编辑:我一直在跌跌撞撞,直到我意识到我的问题可能是由 MEF 引起的。

我已经覆盖了默认的 ControllerFactory 并实现了一个使用 MEF 来实例化服务的 Controller 。我可能看到的是 MEF 在调用之间使对象保持事件状态。

所以

1) 我在哪里可以阅读有关此行为的更多信息?我可以做些什么来阻止它并在每次调用对象时强制重新组合?

谢谢。

最佳答案

在拔掉我的头发几个小时后,我最终解决了这个问题。

我的 ControllerFactory 实现如下所示。

public class ControllerFactory : IControllerFactory
{
CompositionContainer container;
DefaultControllerFactory controllerFactory;

public ControllerFactory()
{
container = new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
controllerFactory = new DefaultControllerFactory();
}

public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
{
var controller = controllerFactory.CreateController(requestContext, ControllerName);

container.ComposeParts(controller);

return controller;
}

public void ReleaseController(IController controller)
{
var disposable = controller as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
}

我在我的应用程序启动中调用了这一行。

ControllerBuilder.Current.SetControllerFactory(new ControllerFactory());

发生的事情是 Controller 工厂在每个 AppDomain 周期只被初始化一次,因此我的组合容器也是如此。我的服务类没有专门标记为共享或非共享使用,因此容器保留了每个服务类的引用。每次 ControllerFactory 在每次调用时创建一个新的 Controller 时,它都会使用上次调用时仍然保留的引用填充服务属性,包括导致数据不匹配的旧 ObjectContext。

我的整个问题都通过添加解决了

[PartCreationPolicy(CreationPolicy.NonShared)]

每项服务每次都执行一个新版本。

现在我想知道 MEF 是否仍在保留那些引用,因为要保留 ObjectContext 不是一件小事。这是等待发生的内存泄漏吗?

关于c# - Entity Framework 自跟踪实体和 ASP MVC .NET 和托管扩展框架的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3279541/

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