代码之家  ›  专栏  ›  技术社区  ›  Wayne Allen

团结一致解析具有依赖项注入的类

  •  0
  • Wayne Allen  · 技术社区  · 8 年前

    我在Xamarin表单应用程序中使用Unity来控制依赖注入。我有一个视图模型类,它将父id和unity注入服务作为构造函数参数。

    public class BrowseViewModel {
        public BrowseViewModel(int parentId, IInjectedService injectedService) {
        }
    }
    

    我已经在unity容器中注册了该类。

    unityContainer.registerType<BrowseViewModel>();
    

    unityContainer.registerType<IInjectedService, InjectedService>();
    

    我的问题是,如何指定 parentId injectedService

    3 回复  |  直到 8 年前
        1
  •  2
  •   Zenuka    8 年前

    你有几个选择。您可以这样注册BrowserViewModel:

    unityContainer.RegisterType<BrowseViewModel>(new InjectionFactory(c => new BrowseViewModel(1234, c.Resolve<IInjectedService>())));
    

    但是这样你就有了一个固定的值 parentId (本例中为1234)。

    您也可以使用如下工厂设计模式:

    public class BrowseViewModelFactory
    {
        private IInjectedService _injectedService;
        public BrowseViewModelFactory(IInjectedService injectedService)
        {
            _injectedService = injectedService;
        }
        public BrowseViewModel CreateBrowseViewModel(int parentId)
        {
            return new BrowseViewModel(parentId, _injectedService);
        }
    }
    

    然后注入 BrowseViewModelFactory BrowseViewModel 并使用正确的 父ID

    public class SomeOtherClass
    {
        private BrowseViewModelFactory _browseViewModelFactory;
        public SomeOtherClass(BrowseViewModelFactory browseViewModelFactory)
        {
            _browseViewModelFactory = browseViewModelFactory;
        }
    
        public void DoStuff()
        {
            var browseViewModel = _browseViewModelFactory.CreateBrowseViewModel(4321);
        }
    }
    
        2
  •  0
  •   Crekate    8 年前

    你需要注册 BrowseViewModel 就像这样:

    container.RegisterType<Func<int, BrowseViewModel>>(
                    new InjectionFactory(c =>
                        new Func<int, BrowseViewModel>(id=> c.Resolve<BrowseViewModel>(new ParameterOverrides { { "parentId", id},))));
    

    Func<int, BrowseViewModel> browseViewMdoelFactory 这样使用:

    class SomeViewClass
    {
        SomeViewClass(Func<int, BrowseViewModel> browseViewMdoelFactory)
        {    
        browsceViewModelFactory(parentId);
        }
    }
    
        3
  •  0
  •   George Alexandria    8 年前

    此外,您可以设置 parentId 当你试图解决 BrowserViewModel

    首先,只需注册类型:

            container.RegisterType<BrowseViewModel>();
            // Mark that InjectedService is the singleton using ContainerControlledLifetimeManager
            container.RegisterType<IInjectedService, InjectedService>(new ContainerControlledLifetimeManager());
    

    然后解析类型。为此,在尝试解析类型时,需要重写构造函数中的所有基元类型,以便可以使用 ParameterOverrides 正如@Crekate在回答中指出的,或者可以直接把 params ParameterOverride

            var vm = container.Resolve<BrowseViewModel>(new ParameterOverride("parentId", 546));