簡體   English   中英

使用 IRepository 和彼此的 ASP.NET C# 服務

[英]ASP.NET C# Services using IRepository and each other

我有使用NinjectInRequestScope綁定的IRepository接口。

存儲庫綁定是:

kernel.Bind<IRepository>().To<DefaultRepository>().InRequestScope().WithConstructorArgument("dbContext", dbContext => kernel.Get<DefaultContext>());

如果我有一個以相同方式綁定的服務IAccountService

具體實現:

public class AccountService : IAccountService
{
    IRepository _repository;

    public AccountService(IRepository repository) { _repository = repository; }
}

如果我現在創建另一個以相同方式綁定的服務IBlogService

具體實現:

public class BlogService : IBlogService
{
    IRepository _repository;
    IAccountService _accountService;

    public AccountService(IRepository repository, IAccountService accountService) 
    {
        _repository = repository; 
        _accountService = accountService;
    }
}

這兩個服務都要求IRepository他們獲得相同的實例還是他們請求兩個完全不同的隔離DbContext s?

它確實“有效”,但這種方法有明顯的缺點嗎?

因為您使用.InRequestScope()所有服務在您的請求期間都獲得相同的DefaultRepository實例。 所以當一個新請求進來時,你的DefaultRepository一個新實例被創建。

此外,如果您的IRepository接口實現IDisposable ,Ninject 將在需要時處理它。

我不認為有任何失敗,因為在 Web 應用程序中,您的DbContext的生命周期應該是每個請求(除非您有很好的理由不遵循這種方法)。

編輯

您還可以為每個請求模式實現一個事務,這樣您可以避免在一個存儲庫中保存成功但在另一個存儲庫中保存失敗的情況下出現不一致。 通過這種方式,您可以在請求期間出現任何問題時回滾所有更改。

不是說你應該實現這個,只是想讓你知道這是可能的。 這是一個非常基本的示例,您應該對何時要創建事務(例如僅在 http POSTS 上)進行一些額外的檢查,並且可能您想將其委托給一個單獨的類,這樣您的 Global.asax 就不會變得混亂與所有這些 resposiblilites。 另一件事要提到的是,這僅在您將 DbContext 注入 .InRequestScope() 時才有效,因此通過您的請求使用相同的上下文。

它是這樣工作的:

在您的 Global.asax Application_BeginRequest() 方法中,您應該像這樣初始化您的交易:

  var transaction = _context.Database.BeginTransaction(IsolationLevel.ReadCommitted);
  _httpContext.Items["_Transaction"] = transaction;

在您的 Global.asax Application_Error() 方法中,您可以設置這樣的錯誤標志

_httpContext.Items["_Error"] = true;

最后在您的 Global.asax Application_EndRequest() 中,如果沒有錯誤,您可以提交所有內容,否則回滾:

  var transaction = (DbContextTransaction)_httpContext.Items["_Transaction"];

  if (_httpContext.Items["_Error"] != null)
        transaction.Rollback();
  else
        transaction.Commit();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM