Unity容器 - 解析始终具有相同构造函数参数的对象

时间:2017-07-15 08:50:10

标签: c# unity-container

我想在我的代码中只有一个TestClass实例。这个类需要字符串参数。问题是,如何在UnityConfig类中将此对象注册到具有字符串参数的统一容器,然后在代码中的每个地方解析此对象?我试过这样的但是在解决过程中我得到了例外。

这是我的班级:

    public class TestClass
    {
        public TestClass(string str)
        {
            message = str;
        }

        private string message;

        public string Message
        {
            get => message;
            set
            {
                message = value;
            }
        }
    }

这是我的UnityConfig课程:

    public class UnityConfig
    {
        private readonly UnityContainer unityContainer;

        public UnityConfig()
        {
            unityContainer = new UnityContainer();
            unityContainer.RegisterType<TestClass>(new InjectionConstructor("Injected string"));
            var unityServiceLocator = new UnityServiceLocator(unityContainer);
            ServiceLocator.SetLocatorProvider(() => unityServiceLocator);
        }
    }

我正在解决这个问题:

var serviceLocator = (UnityServiceLocator)ServiceLocator.Current;
var unityContainer = (UnityContainer)serviceLocator.GetService(typeof(UnityContainer));
var testClass = unityContainer.Resolve<TestClass>();

然后我得到了这个例外:

  

未处理的例外:

     

Microsoft.Practices.Unity.ResolutionFailedException:解析   依赖失败,输入=&#34; SpotFinder.ViewModels.TestClass&#34;,name =   &#34;(无)&#34;

     

在解析时发生异常。

     

异常是:InvalidOperationException - String类型不能   建造。您必须配置容器以提供此值。

           

在例外时,容器是:

     

解决SpotFinder.ViewModels.TestClass,(无)
  解析参数&#34; str&#34;构造函数SpotFinder.ViewModels.TestClass(System.String str)
  解析System.String,(无)

我也尝试过这样注册:

unityContainer.RegisterType<TestClass>(new InjectionConstructor(
                new InjectionParameter("Injected string"))
            );

1 个答案:

答案 0 :(得分:0)

您使用UnityContainer未获得GetService(typeof(UnityContainer))注册的新TestClass实例,因此在解决期间会给您一个例外。只需直接使用serviceLocator来解析TestClass。它看起来像这样:

var serviceLocator = (UnityServiceLocator)ServiceLocator.Current;
var testClass = serviceLocator.GetService(typeof(TestClass));

注册:

var unityContainer = new UnityContainer();
// Configure only one instance of testclass
unityContainer.RegisterType<TestClass>(new ContainerControlledLifetimeManager(), new InjectionConstructor("Injected string"));
var unityServiceLocator = new UnityServiceLocator(unityContainer);
ServiceLocator.SetLocatorProvider(() => unityServiceLocator);

P.S。我不建议您使用ServiceLocator,您可以查看他的advantages/disadvantages