我建立使用实体框架代码首先与mvc4 Web应用程序的方式分层的应用,主要是分离的Data
,Services
和Web
。实体框架:Code First。共享和实例上下文
从我的网站我这样做:
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);
这是,至少,这是一个体面的方式来克服呢?我会感谢提供的任何帮助。谢谢。
+1为DI提,每个请求是要走的路。 – Maess
好的,点了。你能否给我提供一些关于如何通过DI实现这一点的指导,也许我可以用一个简短的例子来改变我的解决方案?谢谢。 – Esteban
@Esteban - 不幸的是,有很多不同种类的依赖注入容器,在你到达那里之前,你需要更多地了解DI。所以很难举一个例子,因为你选择哪个DI容器会影响事物。 –