Have to register every class before the autofac container can resolve?
-
26-09-2019 - |
Question
let's say this scenario:
public class B {};
public class C
{
public C(B b){}
}
To resolve C from Autofac container, I have to register both B and C to container. But, today I used Unity, it seems I just need to register B to container, then C can be resolved.
So Autofac can't do as Unity do?
Solution
With out-of-the-box Autofac it is expected that every type you want to use is registered with the container, either directly using the Register...
methods or in bulk using RegisterAssemblyTypes
. But there are other options too, take a look at Nicholas article about resolving everything. So yes, Autofac can do what Unity does, but you'll have to enable it.
Update: actually, the "resolve anything" feature is built-in now, and you can do the following:
var cb = new ContainerBuilder();
cb.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
return cb.Build();
With the AnyConcreteTypeNotAlreadyRegisteredSource
you can actually resolve both C
and B
without registering any of them.
Note that the lifetime of services resolved by AnyConcreteTypeNotAlreadyRegisteredSource
will be "per dependency scope".
Note: this topic over at the Autofac discussion group is related.