【问题标题】:Unity.Resolve for a class with a dependency injectionUnity.Resolve 用于具有依赖注入的类
【发布时间】:2017-08-25 06:39:54
【问题描述】:

我正在使用 Unity 来控制我的 Xamarin Forms 应用程序中的依赖注入。我有一个视图模型类,它采用父 ID 和统一注入服务作为构造函数参数。

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

我已经在统一容器中注册了这个类。

unityContainer.registerType<BrowseViewModel>();

我也在统一容器中注册了服务。

unityContainer.registerType<IInjectedService, InjectedService>();

我的问题是,当 Unity 创建我的类的实例时,如何指定 parentId 的值?我不认为我应该指定injectedService参数,因为我已经用unity注册了这个类,它是一个单例类。

【问题讨论】:

    标签: c# xamarin dependency-injection xamarin.forms unity-container


    【解决方案1】:

    您有几个选择。您可以像这样注册您的 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);
        }
    }
    

    然后在需要BrowseViewModel 的类中注入BrowseViewModelFactory,并使用正确的parentId 调用create 方法。喜欢:

    public class SomeOtherClass
    {
        private BrowseViewModelFactory _browseViewModelFactory;
        public SomeOtherClass(BrowseViewModelFactory browseViewModelFactory)
        {
            _browseViewModelFactory = browseViewModelFactory;
        }
    
        public void DoStuff()
        {
            var browseViewModel = _browseViewModelFactory.CreateBrowseViewModel(4321);
        }
    }
    

    【讨论】:

      【解决方案2】:

      你需要像这样注册BrowseViewModel

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

      然后在你使用BrowseViewModel的contrutor中,你需要使用Func&lt;int, BrowseViewModel&gt; browseViewMdoelFactory 并像这样使用它:

      class SomeViewClass
      {
          SomeViewClass(Func<int, BrowseViewModel> browseViewMdoelFactory)
          {    
          browsceViewModelFactory(parentId);
          }
      }
      

      【讨论】:

        【解决方案3】:

        另外,您可以在尝试解析BrowserViewModel时设置parentId

        一开始只注册类型:

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

        然后解析类型。为此,您需要在尝试解析类型时覆盖构造函数中的所有原始类型,因此您可以使用@Crekate 的答案中指出的ParameterOverrides,或者可以直接输入params ParameterOverride,如下代码所示:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-02
          • 2015-08-30
          • 2018-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多