1

Ninject DIを使用して、MVCコントローラーからインスタンス化する2つのインターフェイスを実装しました。例えば:

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手法を使用してこれを行うためのより良い/よりクリーンな方法があるかどうか疑問に思いました-理想的にはIUnitOfWorkAssetServiceコンストラクターにを追加したいですか?

4

1 に答える 1

2

それなら、単ににを注入してみませんIUnitOfWorkAssetService

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

    public FileSystemAssetService(IUnitOfWork unitOfWork, string rootPath)
    {
        this.unitOfWork = unitOfWork;
        this.rootPath = rootPath;
    }
}
于 2013-02-19T22:41:13.490 に答える