Autofac 模块注册
Autofac module registrations
我主要使用Ninject,所以如果我混淆了术语,我深表歉意。
我创建了一个记录器模块来使用目标 class 名称作为记录器名称来处理 NLog。它与此非常相似:http://docs.autofac.org/en/latest/examples/log4net.html?highlight=log4net
我还在我的服务层中创建了一个模块,负责处理所有服务级别注册。看起来像这样:
public class ServiceModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(x => new AccountService(x.Resolve<ILogger>()))
.As<IAccountService>()
.InstancePerRequest();
}
}
这是我的 autofac 注册:
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterModule(new LoggingModule());
builder.RegisterModule(new ServiceModule());
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
app.UseAutofacMiddleware(container);
app.UseAutofacMvc();
在运行时,我收到一个异常,提示 ILogger 尚未注册,我是否遗漏了有关模块工作方式的信息,导致 ILogger 在我的服务模块中不可见?
一个模块可以做很多事情:它可以注册新组件 and/or 订阅 Autofac 事件。
在这种情况下,LoggingModule
不会注册 ILog
。它使用 Preparing
事件拦截其他组件的准备工作,并添加一个新的 Parameter
,如果需要,它将创建 ILog
。
您将无法解析 ILog
,但如果您的 AccountService
实施需要 ILog
,将触发以下 Parameter
并提供 ILog
实施。
new ResolvedParameter(
(p, i) => p.ParameterType == typeof(ILog),
(p, i) => LogManager.GetLogger(p.Member.DeclaringType)
)
您所要做的就是注册您的类型,而无需尝试显式创建实例:
builder.RegisterType<AccountService>()
.As<IAccountService>()
.InstancePerRequest();
我主要使用Ninject,所以如果我混淆了术语,我深表歉意。
我创建了一个记录器模块来使用目标 class 名称作为记录器名称来处理 NLog。它与此非常相似:http://docs.autofac.org/en/latest/examples/log4net.html?highlight=log4net
我还在我的服务层中创建了一个模块,负责处理所有服务级别注册。看起来像这样:
public class ServiceModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(x => new AccountService(x.Resolve<ILogger>()))
.As<IAccountService>()
.InstancePerRequest();
}
}
这是我的 autofac 注册:
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterModule(new LoggingModule());
builder.RegisterModule(new ServiceModule());
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
app.UseAutofacMiddleware(container);
app.UseAutofacMvc();
在运行时,我收到一个异常,提示 ILogger 尚未注册,我是否遗漏了有关模块工作方式的信息,导致 ILogger 在我的服务模块中不可见?
一个模块可以做很多事情:它可以注册新组件 and/or 订阅 Autofac 事件。
在这种情况下,LoggingModule
不会注册 ILog
。它使用 Preparing
事件拦截其他组件的准备工作,并添加一个新的 Parameter
,如果需要,它将创建 ILog
。
您将无法解析 ILog
,但如果您的 AccountService
实施需要 ILog
,将触发以下 Parameter
并提供 ILog
实施。
new ResolvedParameter(
(p, i) => p.ParameterType == typeof(ILog),
(p, i) => LogManager.GetLogger(p.Member.DeclaringType)
)
您所要做的就是注册您的类型,而无需尝试显式创建实例:
builder.RegisterType<AccountService>()
.As<IAccountService>()
.InstancePerRequest();