私は協力しているプロジェクトを持っており、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();
}
IUnitOfWorkはIDisposableから派生していますか? –
申し訳ありませんが、そうです – adc90