我正在使用实体框架代码优先方法和 mvc4 Web 应用程序构建一个分层应用程序,主要以Data
、Services
和Web
.
在我的网站上,我这样做:
public void Foo() {
EntityService _svc = new EntityService();
Entity = _svc.FindById(1);
}
服务方法如下所示:
private readonly MyContext _ctx = new MyContext();
public Entity FindById(long id) {
return _ctx.Entities.SingleOrDefault(q => q.EntityId == id);
}
问题是当我需要使用多个服务时,因为每个服务都会创建自己的上下文。
试图解决这个问题我做了这样的事情:
public class MyContext : DbContext {
private static MyContext _ctx;
public MyContext() : base("name=myConnectionString") { }
public static MyContext GetSharedInstance() {
return GetSharedInstance(false);
}
public static MyContext GetSharedInstance(bool renew) {
if(_ctx == null || renew)
_ctx = new MyContext();
return _ctx;
}
}
将我的服务更改如下:
public class EntityService
{
private readonly MyContext _ctx;
public bool SharedContext { get; private set; }
public EntityService()
: this(false) { }
public EntityService(bool sharedContext)
: this(sharedContext, false) { }
public EntityService(bool sharedContext, bool renew)
{
SharedContext = sharedContext;
if (SharedContext)
_ctx = MyContext.GetInstance(renew);
else
_ctx = new MyContext();
}
}
现在,如果我想分享我的上下文的一个实例,我会做这样的事情:
EntityService _entitySvc = new EntityService(true, true);
AnotherEntityService _anotherEntitySvc = new AnotherEntityService(true);
这至少是克服这个问题的好方法吗?我将不胜感激提供的任何帮助。谢谢。