我在將單體ASP.NET MVC應用程序拆分爲N層應用程序時遇到了很多困難。在下面的示例中,在第一次調用_messageRepo.Create()期間拋出異常,指出DbContext由於已被丟棄而無法使用。我的DbContext被如何處理?
我看不到如何發生這種情況,並試圖在上中止Dispose()方法實際上並不會導致應用程序在調試過程中中斷。
的基本結構如下:
- 控制器與每個服務的實例注入他們使用//即:公共myController的(IMessageService messageService)
- 服務包含庫的任何需要的情況下(即: _messageRepository)
- 庫利用MyContext的一個實例,一個子類的的DbContext 每當需要作爲在下面的示例中個
這些實例被重建
using(var context = new MyContext()) { _messageRepo = new MessageRepository(context); _idRepo = new IdentityRepository(context); var status = _messageRepo.GetStatus(Int32.Parse(message.To)); message.To = status.Header.From.Name; message.ToHash = Obfuscate.SaltAndHash(message.To); message.Subject = "RE:" + status.Header.Subject; var toUser = _idRepo.Get(message.To); var fromUser = _idRepo.Get(_userName); var rawMessage = new Message() { Content = message.Content, Attachments = GetAttachments(message.AttachmentIds) }; var header = new MessageHeader() { To = toUser, From = fromUser, Subject = message.Subject }; _messageRepo.Create(new MessageStatus() { CreatedAt = DateTime.Now, IsRead = false, IsSpam = false, IsTrash = false, Message = rawMessage, Header = header, Owner = header.To }); _messageRepo.Create(new MessageStatus() { CreatedAt = DateTime.Now, IsRead = false, IsSpam = false, IsTrash = false, Message = rawMessage, Header = header, Owner = header.From }); context.Commit(); Email.SendNewMessageNotification(fromUser.Email, toUser.Email); }
存儲庫的方法是檢索使用代碼優先的方法從通過實體框架一個數據庫模型LINQ單行。
這種方法有什麼問題嗎?我確實有MyContext首先實現IUnitOfWork,但我刪除了,直到我得到這個不太複雜的方法功能。
此外,我正在使用IoC framwork(AutoFac)來加載這些接口實現的實例。如果這是問題,那麼我需要改變我的邏輯以適應AutoFac?
//in Global.asax.cs
builder.RegisterType<PonosContext>().As<PonosContext>().InstancePerHttpRequest();
//Example repo constructor
public MessageRepository(PonosContext context)
{
_db = context;
}
最初,我將每個HTTP請求的上下文連接爲一個實例。這是拋出其他EF例外,這導致我採取這種做法。我可以通過將MyContext重新實現爲IUnitOfWork並使用不同的註冊方法再次將它連接到AutoFac中,從而使用塊來擺脫所有這些問題? – XBigTK13X 2012-02-28 16:20:11
另外,我只能通過(_unitOfWork as MyContext)訪問MyContext中的DbSets。我認爲這導致了一些不同的EF異常,是否有更好的方法在構造函數中擁有一個接口,但根據需要訪問上下文的基礎屬性? – XBigTK13X 2012-02-28 16:22:10