簡體   English   中英

從web.config創建實例,並在構造函數中使用Ninject進行依賴注入

[英]Create instance from web.config and with dependency injection in constructor with Ninject

我正在嘗試從web.config配置創建一個對象實例,如下所示:

<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();
}

這可能嗎或我只是做錯了嗎?

/英戈

理想情況下,您會將ILogReporting注入到將使用它的服務中。

public class SomeService : ISomeService
{
    private readonly ILogReporting _logger;

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

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

但是如果你需要在執行時請求實例而不是創建,那么你需要一些方法來從你試圖獲取ILogReporting實例的任何地方訪問DI容器(Ninject內核)。 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....
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM