2015-02-24 114 views
0

我試圖從web.config配置創建一個對象的實例創建實例,像這樣:從web.config中,並與依賴注入的構造與Ninject

<add name="Log4Net" type="Spm.Services.Logging.Log4NetServices.Log4NetReporting, Spm.Services" /> 

類型Log4NetReporting有構造函數的參數我想注入,像這樣:

public class NLogReporting : ILogReporting 
{ 
    [Inject] 
    public NLogReporting(IRepository<NLogError> nLogRepository) 
    { 
     this.nLogRepository = nLogRepository; 
    } 
} 

我試着這樣做是爲了創建這個對象的實例:

var logger = Activator.CreateInstance(type) as ILogReporting; 

但我得到一個異常說「沒有無參數的構造函數已被定義爲這個對象」。

理想情況下,我想使用Ninject來做到這一點,但我不知道如何。我的代碼在不同的程序集中分離,因此Ninject初始化(請參見下文)位於一個程序集(Web應用程序程序集)中,此代碼位於Services程序集中。

這裏是我的Ninject初始化代碼:

private static StandardKernel CreateNinjectKernel() 
{ 
    var kernel = new StandardKernel(); 
    RegisterNinjectServices(kernel); 
    ConfigureAutoMapper(kernel); 
    return kernel; 
} 

private static void RegisterNinjectServices(IKernel kernel) 
{ 
    kernel.Bind<IRepository<NLogError>>().To<Repository<EntityDbContext, NLogError>>().InRequestScope(); 
} 

這是可以做到的還是我只是做這一切錯了嗎?

/英戈

回答

0

理想情況下,你將不得不ILogReporting注入,將使用它的服務。

public class SomeService : ISomeService 
{ 
    private readonly ILogReporting _logger; 

    public SomeService(ILogReporting logger) 
    { 
     _logger = logger; 
    } 

    // .... code.... 
} 

但如果你需要在執行,而不是創作的時間來請求實例,那麼你就需要一些方法來從訪問DI容器(在Ninject內核),無論你是想獲得ILogReporting實例。 Ninject的WebAPI集成將其內核直接連接到System.Web.Mvc.IDependencyResolver,所以我們可以使用它。

public class SomeService : ISomeService 
{ 
    private readonly IDependencyResolver _resolver; 

    public SomeService(IDependencyResolver resolver) 
    { 
     _resolver = resolver; 
    } 

    public void Execute() 
    { 
     var logger = _resolver.GetService<ILogReporting>(); 
     // .... code.... 
    } 
} 
+0

謝謝,戴夫!這非常有幫助! – user3428449 2015-02-27 03:56:12