2017-01-04 4 views
0

私の最近の記事の大部分と同様に、これは私にとって初めてのことです。私は私の理解の端にあります。私は既存のアプリケーションに取り組んでおり、上記のエラーに遭遇しました。DBコンテキストが廃棄されるのはなぜですか?

アプリケーションが3層を有するMVCアプリケーションであり、闊歩を介して実行されている:サービス層DependencyConfig

Rest 

Services 

DAL 

、Iは、コンテキストが登録されているRegister方法では、次の操作を行います

container.RegisterWebApiRequest<DbContext>(() => new LocalContext("name=DefaultConnection")); 

は、これまでのところ、このすべては、アプリケーションの部分が読んで、データベースから書いているように、正常に動作しているようだ - このアプリケーションの多くがあるが、私はそれのすべてを理解していません。

public class AccountController : ApiController 
{ 
    private readonly WindowsAuthenticationProvider _windowsAuthentication; 
    private readonly AuthorizationManager _authorizationManager; 
    private readonly IApplicationUserService _userService; 
    private readonly IProfileService _profileService; 
    private readonly IAccountLogsService _accountLogsService; 

    /// <summary> 
    /// Constructor 
    /// </summary> 
    /// <param name="authorizationManager">Authorization Manager</param> 
    /// <param name="windowsAuthentication">Enables windows reauthentication without a session</param> 
    public AccountController(AuthorizationManager authorizationManager, WindowsAuthenticationProvider windowsAuthentication, 
     IApplicationUserService userService, IProfileService profileService, IAccountLogsService accountLogsService) 
    { 
     _windowsAuthentication = windowsAuthentication; 
     _authorizationManager = authorizationManager; 
     _userService = userService; 
     _profileService = profileService; 
     _accountLogsService = accountLogsService; 
    } 

    /// <summary> 
    /// Get logged in user details 
    /// </summary> 
    /// <remarks>Retrieves details of the currently logged in user</remarks> 
    [Authorize] 
    [HttpGet] 
    [Route("")] 
    [ResponseType(typeof(AccountDetailsModel))] 
    public IHttpActionResult Details() 
    { 
     var userId = User.Identity.GetUserId<int>(); 

     var model = //... 

     if (model.HasAccount) 
     { 
      var user = _authorizationManager.FindUser(User.Identity); 
     } 

     return Ok(model); 
    } 
} 

もサービス層から:

public class AuthorizationManager 
    { 
     private readonly IApplicationUserService _userService; 

     public ApplicationUser FindUser(IIdentity identity) 
     { 
      var userId = identity.GetUserId<int>(); 
      if (userId != 0) 
      { 
       return _userService.FindById(userId); 
      } 

      //... 
     } 
    } 

、最終的にもサービス層上:

public class ApplicationUserService : UnitOfWork<LocalContext>, IApplicationUserService 
    { 
     private readonly UserManager<ApplicationUser, int> _userManager; 
     private readonly RoleManager<ApplicationRole, int> _roleManager; 

     /// <summary> 
     /// Finds a user by id 
     /// </summary> 
     /// <param name="id">User id</param> 
     /// <returns>ApplicationUser</returns> 
     public ApplicationUser FindById(int id) 
     { 
      return _userManager.FindById(id); 
     } 
} 

は次に、残りの層の上に、私は以下の持っています

ApplicationUserは、DALレイヤー上のモデルです。

これまでのところすべてが意味をなさないことを願っています。

return _userManager.FindById(id); 

それは、コンテキストなどのデータベース接続を失ったと言ってすることが私には思えるInvalidOperationException: The operation cannot be completed because the DbContext has been disposed.

をスロー:

問題は、コードがこの行になるときということです。

登録メソッドからDbContextを削除したようですが、なぜそれほどわかりませんか?

私は手動でこのような状況を作成した場合:私は必要なエントリを取得することですが、問題の再さらにラインの下に発生

Context.Users.Find(id); 

を - と私は、アプリケーションが動作するように意図されていたとは思いませんこのような。

私の質問は、どうして私の状況を処分しているのですか?

コードを実行することは役に立たず、私は考えが崩れています。

+1

'UserManager'を投稿してくださいWeb要求の終了時にオブジェクトの処分:これらの指示から

container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle(); 

私はcontainerにこれを追加する必要がコードも同様です。 – Developer

+0

@DeveloperそれはMicrosoft.AspNet.Identityの一部です。 – Alex

+1

'ApplicationUserService'コンストラクタで興味深いものは何ですか? – Developer

答えて

0

問題は、この行に関係した理由:lifestlye.scopedの

container.Register<IUserStore<ApplicationUser, int>, UserStore <ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>>(Lifestyle.Scoped); 

、コンテキストは、この時点で処分されていました。http://simpleinjector.readthedocs.io/en/latest/lifetimes.html#perwebrequest

のみ

関連する問題