从 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....
}
}
我正在尝试从 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....
}
}