partyelite
partyelite

Reputation: 892

Autofac property injection in base class

I am working on a Windows Phone 8.1 application and I have a base class with public property.

public class ViewModelBase
{
   public ISomeClass MyProp {get;set;}
}

My derived class looks like this

public class MainViewModel : ViewModelBase
{
    private readonly INavigation _navigation;
    public MainViewModel(INavigation navigation)
    {
        _navigation = navigation;
    }
}

In my App.cs I have

 var builder = new ContainerBuilder();
 builder.RegisterType<Navigation>().As<INavigation>();
 builder.RegisterType<SomeClass>().As<ISomeClass>();
 builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());

When MainViewModel is created my INavigation is resolved but MyProp is null. I have tried

builder.Register(c => new ViewModelBase { MyProp = c.Resolve<ISomeClass>() });

builder.Register(c => new ViewModelBase()).OnActivated(e => e.Instance.MyProp = e.Context.Resolve<ISomeClass>());

builder.RegisterType<ViewModelBase>().PropertiesAutowired();

but none of it works!

Solution posted here http://bling.github.io/blog/2009/09/07/member-injection-module-for-autofac/

works but I don't like it :)

I don't want to use constructor injection in this case.

Thank you.

Upvotes: 8

Views: 7979

Answers (3)

n0099
n0099

Reputation: 1323

If you can't add more parameters in the constructor of derived class, try use the required property: https://autofac.readthedocs.io/en/latest/register/prop-method-injection.html#required-properties

Upvotes: 0

Josh Close
Josh Close

Reputation: 23373

This will load up all classes that inherit ViewModelBase and inject only the specific properties that you want. A lot of the time, you don't want the other properties on the child class to be injected.

builder.RegisterAssemblyTypes( GetType().Assembly )
    .AssignableTo<ViewModelBase>()
    .OnActivated( args =>
    {
        var viewModel = args.Instance as ViewModelBase;
        if( viewModel != null )
        {
            viewModel.MyProp = args.Context.Resolve<ISomeClass>();
        }
    } );

Upvotes: 18

Peter Lillevold
Peter Lillevold

Reputation: 33910

You must make sure that your viewmodel class, MainViewModel, is registered with property injection. Currently, all you have registered with property injection is ViewModelBase, but think about what you are resolving. You will never resolve ViewModelBase, you're resolving MainViewModels. So that is what needs to be registered in the container.

Try:

builder.RegisterType<MainViewModel>().PropertiesAutowired();

Upvotes: 7

Related Questions