我建立使用實體框架代碼首先與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容器會影響事物。 –