我有以下结构:
class SomeViewModel
{
public SomeViewModel(SomeService service)
{
service.SetViewModel(this); // <- Move this call to Autofac
}
}
class SomeService
{
public void SetViewModel(object viewModel)
{
//...
}
}
我希望将此调用移至IoC容器(Autofac),而不是在每个ViewModel中手动调用service.SetViewModel
。我尝试使用OnActivated
,但没有可用的参数:
builder.Register<SomeViewModel>
.AsSelf()
.OnActivated(e =>
{
var service = e.Parameters
.OfType<SomeService>()
.FirstOrDefault(); // <- There are no parameters
service.SetViewModel(e.Instance);
});
是否可以将service.SetViewModel(this);
构造函数中的SomeViewModel
调用移动到某种Autofac注册状态?
答案 0 :(得分:1)
我同意@Steven。但即使我们将其分开,如果有多个视图模型共享相同的服务呢?哪一个将进入服务 - “最后的胜利”?你想再次考虑这个设计。
既然你已经被警告了......你的解决方案可能就是:
...
builder.Register(s => CreateViewModel(s, svc => new SomeViewModel(svc))).AsSelf();
}
private T CreateViewModel<T>(IComponentContext ctx, Func<SomeService, T> createInstance) {
var svc = ctx.Resolve<SomeService>();
var instance = createInstance(svc);
svc.SetViewModel(instance);
return instance;
}