繁体   English   中英

Unity - 为什么 Resolve(ParameterOverride[]) 不使用预期的构造函数?

[英]Unity - Why isn't Resolve(ParameterOverride[]) using the expected constructor?

我想将 IoD 与实现接口并具有带参数的构造函数的 class 一起使用。

界面:

    public interface IUsefulClass
    {
        string InterestingInfo { get; set; }
        string RelevantStuff { get; set; }
    }

两个简单的属性,没什么好说的。

class:

    public class UsefulClass : IUsefulClass
    {
        public string InterestingInfo { get; set; }

        public string RelevantStuff { get; set; }

        public UsefulClass()
        {
        }

        public UsefulClass(string p_strInterestingInfo)
        {
            InterestingInfo = p_strInterestingInfo;
        }

        public UsefulClass (string p_strInterestingInfo, string p_strRelevantStuff)
        {
            InterestingInfo = p_strInterestingInfo;
            RelevantStuff = p_strRelevantStuff;
        }
    }

它有几个不同的构造函数,每个构造函数都以自己的方式设置属性。

来自另一个 class 的调用:

        public void HereGoes()
        {
            IUnityContainer z_ucoContainer = new UnityContainer();

            z_ucoContainer.RegisterType<IUsefulClass, UsefulClass>();

            IUsefulClass z_objUsefulButEmpty = z_ucoContainer.Resolve<IUsefulClass>();
            IUsefulClass z_objUsefulAndInteresting = z_ucoContainer.Resolve<IUsefulClass>(new ParameterOverride("p_strInterestingInfo", "This is interesting information"));
            IUsefulClass z_objUsefulAndInterestingToo = z_ucoContainer.Resolve<IUsefulClass>(new ParameterOverride[] { new ParameterOverride("p_strInterestingInfo", "This is very interesting information") });
            IUsefulClass z_objUsefulInterestingAndRelevant = z_ucoContainer.Resolve<IUsefulClass>(new ParameterOverride("p_strInterestingInfo", "This is quite interesting information"), new ParameterOverride("p_strRelevantStuff", "More relevant stuff here"));
            IUsefulClass z_objUsefulInterestingAndRelevantAsWell = z_ucoContainer.Resolve<IUsefulClass>(new ParameterOverride[] { new ParameterOverride("p_strInterestingInfo", "This is possibly the most interesting information"), new ParameterOverride("p_strRelevantStuff", "Look for relevant stuff there") });
        }

在测试和调试中,我发现所有五个变量在两个属性中都有null

再调试一些,结果发现每个Resolve()都调用了无参数构造函数。

我尝试删除所述构造函数(当然还有设置z_objUsefulButEmpty的代码行):我收到 Unity.ResolutionFailedException 消息,“解决失败并出现错误:未能 select 是 RegMat_VM.Infrastructure.UsefulClass 的构造函数”。

我看了又看,但找不到我做错了什么。 我怎样才能让它正常工作?

请参考我的代码,我将向您展示它们的用法。

using System;
using System.Collections.Generic;
using Unity;

namespace ConsoleApp1 {
    class Program {
        static void Main (string[] args) {
            IUnityContainer container = new UnityContainer();
            container.RegisterType<IPeople, Swordsman>();//Unnamed default registration, the following default registration will overwrite the previous one
            container.RegisterType<IPeople, Witch>("Witch");//Named registration
            IPeople people=container.Resolve<IPeople>();//Resolve default objects           
            IPeople _witch =container.Resolve<IPeople>("Witch");//Specify the name resolution object
            IEnumerable<IPeople> peoples=container.ResolveAll<IPeople>();//Get all registered named objects of IPeople in the container
            people.ClassName = people.GetType().ToString();
            _witch.ClassName = _witch.GetType().ToString();
            var info1= people.ShowInfo();
            var info2= _witch.ShowInfo();
            foreach (var item in peoples)
                {
                item.ClassName = item.GetType().ToString();
                Console.WriteLine(item.ShowInfo());
                }

            Console.WriteLine(info1);
            Console.WriteLine(info2);
            Console.ReadLine();
            }
        }

    //People interface
    public interface IPeople {
        string ClassName {
            get; set;
            }
        string ShowInfo ();
        }

    //Witch
    public class Witch : IPeople {
        public string ClassName {
            get; set;
            }
        public string ShowInfo () {
            return string.Format("Witch:{0}", ClassName);
            }
        }

    //Swordsman 
    public class Swordsman : IPeople {
        public string ClassName {
            get; set;
            }
        public string ShowInfo () {
            return string.Format("Swordsman:{0}", ClassName);
            }
        }
    }

Output:

在此处输入图像描述

仔细参考它们的用法:

  1. IUnityContainer.RegisterType<TFrom, TTo> 方法 (array<InjectionMember[])
  2. IUnityContainer.RegisterType<TFrom, TTo> 方法(字符串,数组<InjectionMember[])
  3. IUnityContainer.Resolve 方法
  4. IUnityContainer.Resolve 方法(字符串)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM