Is it possible to easily configure autofac so it will only resolve using non-obsolete constructors?
eg for a class with a helper constructor for non-DI code,
public class Example {
    public Example(MyService service) {
        // ...
    }
    [Obsolete]
    public Example() {
        service = GetFromServiceLocator<MyService>();
        // ...
    }
}
// ....
var builder = new ContainerBuilder();
builder.RegisterType<Example>();
// no MyService defined.
var container = builder.Build();
// this should throw an exception
var example = container.Resolve<Example>();
asking autofac to resolve Example if we haven't registered MyService, should fail.
I don't believe there is an out of the box way to configure Autofac to ignore Obsolete constructors.  However, Autofac is so good, there is always a way to get it done :)  Here are two options:
Option 1. Tell Autofac which Constructor to use
Do this using the UsingConstructor registration extension method.
builder.RegisterType<Example>().UsingConstructor(typeof(MyService));
Option 2.  Provide a custom IConstructorFinder to FindConstructorsWith
Autofac has a registration extension method called FindConstructorsWith.  You can pass a custom IConstructorFinder to one of the two overloads.  You could write a simple IConstructorFinder called NonObsoleteConstructorFinder that will only return constructors without the Obsolete attribute.
I have written this class and added a working version of your sample. You can view the full code and use it as inspiration. IMO option this is the more elegant option. I have added it to my AutofacAnswers project on GitHub.
Note:  The other overload takes BindingFlags.  I don't think you can specify attribute requirements using BindingFlags.  However, you may want to check that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With