2013-02-19 3 views
1

Ninject DI를 사용하여 MVC 컨트롤러에서 인스턴스화하는 두 개의 인터페이스를 구현했습니다. 예를 들어 :DI 생성자에서 공통 인스턴스 참조

public class MyController : Controller 
{ 
    private readonly IUnitOfWork _UnitOfWork; 
    private readonly IAssetService _AssetService; 

    public MyController(IUnitOfWork unitOfWork, IAssetService assetService) 
    { 
     this._UnitOfWork = unitOfWork; 
     this._AssetService = assetService; 
    } 

    // Controller actions etc. 
} 

내 Ninject에 모듈에서 나는 다음과 같은 바인딩을 만들었습니다

public class DomainModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IUnitOfWork>() 
     .To<SqlUnitOfWork>() 
     .InRequestScope() 
     .WithConstructorArgument("connectionString", "MyDb.Database"); 

     Bind<IAssetService>() 
     .To<FileSystemAssetService>() 
     .WithConstructorArgument("rootPath", "C:\\DataStore"); 
    } 
} 

내가 지금에 IUnitOfWork 인스턴스를 주입 할을 내 IAssetService 그래서이에게 IAssetService의 특성을 고려하고 내 컨트롤러를 다음과 같이 수정합니다 :

public class MyController : Controller 
{ 
    private readonly IUnitOfWork _UnitOfWork; 
    private readonly IAssetService _AssetService; 

    public MyController(IUnitOfWork unitOfWork, IAssetService assetService) 
    { 
     this._UnitOfWork = unitOfWork; 
     this._AssetService = assetService; 

     this._AssetService.UnitOfWork = this._UnitOfWork; 
    } 

    // Controller actions etc. 
} 

그러나이 작업을 수행하는 방법이 더 좋았는지 궁금했습니다. 다른 DI 기술을 사용합니다. 이상적으로 AssetService 생성자에 IUnitOfWork을 추가하고 싶습니다.

답변

2

AssetServiceIUnitOfWork을 삽입하면됩니다.

public class FileSystemAssetService : IAssetService 
{ 
    private readonly IUnitOfWork unitOfWork; 
    private readonly string rootPath; 

    public FileSystemAssetService(IUnitOfWork unitOfWork, string rootPath) 
    { 
     this.unitOfWork = unitOfWork; 
     this.rootPath = rootPath; 
    } 
} 
+0

예,이 작업은 완벽하게 작동합니다. InRequestScope()가 모든 생성자가 참조하는 단일 개체를 효과적으로 생성한다는 사실을 깨닫지 못했습니다. 당신의 도움을 주셔서 감사합니다. – Neilski

+0

probs 없음. 다행히 도울 수있어 :) – levelnis

관련 문제