我正在尝试从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();
}
这可能吗或我只是做错了吗?
/英戈
答案 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....
}
}