从 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;

但是我得到一个异常 "No parameterless constructor has been define for this object"。

理想情况下,我想使用 Ninject 来执行此操作,但我不知道如何操作。我的代码分散在不同的程序集中,因此 Ninject 初始化(见下文)在一个程序集中(Web 应用程序程序集),而这段代码在服务程序集中。

这是我的 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....
}

但是如果您需要在执行时请求实例,而不是创建时,那么您将需要某种方式从任何您试图获取的地方访问 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....
    }
}