我重新發布這個問題,因爲我認爲它有點含糊。 New PostInSingletonScope使用Ninject和Windows服務
我正在使用2分鐘計時器上的Windows服務。我首先使用EF代碼和存儲庫模式進行數據訪問。我正在使用Ninject來注入我的依賴項。我有以下的綁定在我NinjectDependencyResolver類:
ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings["Database"];
Bind<IDatabaseFactory>().To<DatabaseFactory>()
.InSingletonScope()
.WithConstructorArgument("connectionString", connectionStringSettings.Name);
Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope();
Bind<IMyRepository>().To<MyRepository>().InSingletonScope();
當我的服務運行,每2分鐘我做類似這樣的一些東西:
foreach (var row in rows)
{
var existing = myRepository.GetById(row.Id);
if (existing == null)
{
existing = new Row();
myRepository.Add(existing);
unitOfWork.Commit();
}
}
我開始看到一個錯誤在我的日誌,這些日誌說:
成功提交對數據庫的更改,但更新對象上下文時發生錯誤。 ObjectContext可能處於不一致的狀態。內部異常消息:由於對象的鍵值與ObjectStateManager中的另一個對象衝突,因此AcceptChanges無法繼續。在調用AcceptChanges之前確保鍵值是唯一的。
在Windows服務中使用Ninject時,使用InSingeltonScope是否正確?我相信我嘗試過使用InTransientScope等不同的範圍,但我只能讓InSingeltonScope使用數據訪問。錯誤消息與Scope有任何關係還是與它無關?
Remo,我讀過你關於ninject工廠的文章,但似乎這是Ninject 3.0的一部分?我目前正在使用2.2.1.4。還有其他的文章可以看嗎?當我選擇使用Windows服務的Ninject時,我似乎很難理解。任何幫助表示讚賞。 – Thomas 2012-02-09 04:07:24
我建議更新。應該可以沒有任何巨大的改變。否則,你必須手動實現工廠,但其他任何事情都保持不變。 – 2012-02-09 11:08:43
我會考慮Ninject 3作爲一個選項。謝謝。 – Thomas 2012-02-09 17:50:44