我似乎在我的代码中做了相当多的事情:
public class ActionsModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
builder.Register(c => LogManager.GetCurrentClassLogger()).As<ILog>().InstancePerDependency();
// Autofac doesn't seem to be able to inject things without explicit binding
builder.RegisterType<ComboActions>().As<ComboActions>().InstancePerHttpRequest();
builder.RegisterType<AppActions>().As<AppActions>().InstancePerHttpRequest();
}
}
}
'actions'类是一个类,我需要将其注入到我的控制器中,并具有各种其他子依赖项。
似乎有点垃圾。为什么autofac无法解析该类是否具有已满足依赖关系的构造函数并自动生成实例?
我的意思是,如果A类需要注入B类而B类需要C,D,E等等,我想您不想走完整个依赖链,看看是否可以在运行。 ...但是如果A类直接依赖于明确约束的C和D,那肯定是一个微不足道的案例?
我错过了什么吗?似乎无法看到任何相关的文档...
答案 0 :(得分:24)
您无需注册所有类型。 Autofac提供AnyConcreteTypeNotAlreadyRegisteredSource,如果您尚未提供注册,它将自动获取具体类型。
例如:
var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
var container = builder.Build();
...
var myConcreteType = container.Resolve<MyConcreteType>();
源代码允许更复杂的东西,例如automatically injecting mocked objects用于接口和基于抽象类的依赖项。
答案 1 :(得分:2)
AFAIK,Autofac要求在容器中注册所有需要的类型,但这并不意味着您必须单独执行每个类型。几乎99%的注册都是通过将此属性添加到类型来处理的:
[AttributeUsage(AttributeTargets.Class)]
public class AutoRegisterAttribute : Attribute { }
例如,你有
[AutoRegister]
class ComboActions
{
然后我用这个注册:
public class AutoScanModule : Module
{
private readonly Assembly[] _assembliesToScan;
public AutoScanModule(params Assembly[] assembliesToScan)
{
_assembliesToScan = assembliesToScan;
}
protected override void Load(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes(_assembliesToScan)
.Where(t => t.GetCustomAttributes(typeof (AutoRegisterAttribute), false).Any())
.AsSelf()
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
}
}
就像我说的,这涵盖了我的大多数注册,然后我通常只需要担心第三方类型,开放式泛型和装饰器等事情。
编辑:查看证明我错误的reply from Kaleb。很酷的功能,我从来不知道!