Autofac:解析后获取构造函数参数(OnActivated / OnActivating)

时间:2018-04-18 09:36:28

标签: c# dependency-injection inversion-of-control autofac ioc-container

我有以下结构:

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注册状态?

1 个答案:

答案 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;
    }