Autofac property injection in base class

左心房为你撑大大i 提交于 2021-01-27 06:12:32

问题


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.


回答1:


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();



回答2:


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>();
        }
    } );


来源:https://stackoverflow.com/questions/26808072/autofac-property-injection-in-base-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!