2013-02-19 5 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 - в идеале я хотел бы добавить IUnitOfWork в конструктор AssetService?

ответ

2

Тогда почему бы просто не ввести IUnitOfWork в AssetService?

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

Нет проблем. Рад, что смог помочь :) – levelnis

Смежные вопросы