2016-11-23 4 views
0

私は協力しているプロジェクトを持っており、ninjectを統合しようとしています。私が設定した方法は、2つの同様の基本クラスから継承するいくつかのサービスクラスを持っていることです。AbstractService & AbstractReadableServiceから、私の作業ユニットを通してデータレイヤーにアクセスできます。私が処理したい主な依存関係は、UnitOfWorkによって保持されているDataContextであり、これはninjectによって順番に注入されます。リソースを処分するように指示するInRequestScope

これらのコンポーネントをすべてセットアップする方法は、ServiceFactoryをコントローラに入れて、ninjectから必要な依存関係を取得することです。次に、サービスが必要なときはいつでも、ServiceFactoryのコピーからそのサービスに必要な依存関係を設定し、そのサービスのコピーを使用できる状態に戻すGetServiceメソッドを使用します。しかし、新しいページに移動したり、他のアクションを実行すると、UnitOfWorkのDisposeメソッドが呼び出されることはありません。

私は、ServiceFactoryとその依存関係が各リクエストで作成され、新しいリクエストを設定するたびにUnitOfWorkがデータベースコンテキストを破棄すると考えました。しかし、私は処分方法を打つわけではないし、誰かが私を正しい方向に向けることを望んでいた。

抽象サービス:

AbstractReadableServiceは作業ユニットを保持します。作業クラスの

public abstract class AbstractService : AbstractReadableService 
{ 
    /// <summary> 
    /// Gets the current user id all lowercase at run time 
    /// </summary> 
    protected string UserId; //TODO: Change, to a more complete object, ex: We can resolve the employee number at startup time and get all that from an object returned by ICustomPrincipalService 

    public AbstractService() { } 

    /// <summary> 
    /// Constructor for abstract service that we can use to create a new service inside of other services 
    /// </summary> 
    /// <param name="user"></param> 
    /// <param name="unitOfWork"></param> 
    public AbstractService(ICustomPrincipalService user, IUnitOfWork unitOfWork) 
    { 
     if (base._unitOfWork == null || this.UserId == null) 
     { 
      this.UserId = user.GetUser(); 
      base._unitOfWork = unitOfWork; 
     } 
    } 

    public void SetDependencies(ICustomPrincipalService user, IUnitOfWork unitOfWork) 
    { 
     if (base._unitOfWork == null || this.UserId == null) 
     { 
      this.UserId = user.GetUser(); 
      base._unitOfWork = unitOfWork; 
     } 
     else 
     { 
      // Throw some really nasty error 
     } 
    } 
} 

ユニット

public class UnitOfWork : IUnitOfWork 
{ 
    private DataContext _dataContext; 


    public UnitOfWork(DataContext dataContext) 
    { 
     //Misc 
     _dataContext = dataContext; 
     ISomeRepo SomeRepo { get; private set; } 

     //Repositories 
     SomeRepo = new SomeRepo(dataContext); 

    } 

    public void SaveChanges(string userId) 
    { 
     RecordAuditProperties(userId); 
     _epmsContext.SaveChanges(); 
    } 

    private bool disposed = false; 
    protected virtual void Dispose(bool disposing) 
    { 
     if (!disposed) 
     { 
      if (disposing) 
      { 
       _dataContext.Dispose(); 
      } 
     } 
     disposed = true; 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
} 

サービス工場

public class ServiceFactory : IServiceFactory 
{ 
    private IUnitOfWork _unitOfWork; 
    private ICustomPrincipalService _userInfo; 
    private IEmployeeCredentialService employeeCredentials; 

    public ServiceFactory(IUnitOfWork unitOfWork, ICustomPrincipalService userInfo, IEmployeeCredentialService employeeCredentials) 
    { 
     _unitOfWork = unitOfWork; 
     _userInfo = userInfo; 
    } 

    public T GetService<T>() where T : AbstractService, new() 
    { 
     T svc = new T(); 

     svc.SetDependencies(_userInfo, _unitOfWork); 

     return svc; 
    } 

    public T GetReadOnlyService<T>() where T : AbstractReadableService, new() 
    { 
     T svc = new T(); 

     svc.SetDependencies(_unitOfWork); 

     return svc; 
    } 
} 

Ninjectバインディング:

private void AddBindings() 
    { 
     // Binding context to ensure only one context is used in the lifetime of the request 
     kernel.Bind<DataContext>().ToSelf().InRequestScope(); 
     kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 

     //Deals with pulling the current HTTP context user id into the services 
     kernel.Bind<ICustomPrincipalService>().To<CustomPrincipalService>().InRequestScope(); 
     kernel.Bind<IHttpContextFactory>().To<HttpContextFactory>().InRequestScope(); 
     kernel.Bind<IEmployeeCredentialService>().To<EmployeeCredentialService>().InRequestScope(); 

     //Disposible dependencies are passed here 
     kernel.Bind<IServiceFactory>().To<ServiceFactory>().InRequestScope(); 
    } 
+1

IUnitOfWorkはIDisposableから派生していますか? –

+0

申し訳ありませんが、そうです – adc90

答えて

0

すべてが正しかったが、私はそれが私の後に動作させることができましたNinject MVC4ソリューションをインストールナゲットから

関連する問題