从web.config创建实例,并在构造函数中使用Ninject进行依赖注入

时间:2015-02-24 11:09:06

标签: c# dependency-injection ninject asp.net-web-api

我正在尝试从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应用程序程序集)中,此代码位于服务程序集中。

这是我的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();
}

这可能吗或我只是做错了吗?

/英戈

1 个答案:

答案 0 :(得分:0)

理想情况下,您将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....
    }
}