问题
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