繁体   English   中英

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

[英]Unity container - resolve object which always same constructor parameter

我想在我的代码中只有一个TestClass实例。 此类需要字符串参数。 问题是,如何在UnityConfig类中使用字符串参数将该对象注册到unity容器一次,然后在代码中的任何地方解析该对象? 我这样尝试过,但是在解决过程中却遇到异常。

这是我的课:

    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:依赖关系的解析失败,类型=“ SpotFinder.ViewModels.TestClass”,名称=“(无)”。

发生以下异常:正在解决。

异常是:InvalidOperationException-无法构造类型String。 您必须配置容器以提供该值。


在发生异常时,容器为:

解决SpotFinder.ViewModels.TestClass,(无)
解析构造函数SpotFinder.ViewModels.TestClass(System.String str)的参数“ str”
解析System.String,(无)

我试过也这样注册:

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

您会使用未注册TestClass GetService(typeof(UnityContainer))获得UnityContainer新实例,因此在解析过程中会出现异常。 只需直接使用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);

PS我不建议您使用ServiceLocator ,您可以看看他的一些优缺点

暂无
暂无

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

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