为什么“resolve"方法总是调用已经在Unity中注册的类构造函数

本文关键字:Unity 注册 构造函数 调用 resolve quot 方法 为什么 | 更新日期: 2023-09-27 18:04:49

我在WPF应用程序中使用UnityPrism。我有一个在Bootstrapper中以这种方式注册到Container的类:

Container.RegisterType<MyClass>();

类有一个带ILoggerFacade接口作为参数的构造函数:

private ILoggerFacade _logger;
    public MyClass(ILoggerFacade logger)
    {
        _logger = logger;
        //do some stuff
    }

当我试图解析该类实例时,我意识到在返回实例时调用了类构造函数。所以,所有的东西都是从头开始的。我这样解析实例:

MyClass a = Container.Resolve<MyClass>();

每次执行Resolve方法时调用构造函数的原因是什么?

为什么“resolve"方法总是调用已经在Unity中注册的类构造函数

如果您不希望组件在每次解析时都被实例化,则需要将其生命周期声明为ContainerControlled:

myContainer.RegisterType<MySingletonObject>(new ContainerControlledLifetimeManager());

参见https://msdn.microsoft.com/en-us/library/dn178463%28v=pandp.30%29.aspx#sec34,但要注意副作用,因为您的对象将表现得像一个单例

Unity默认使用瞬态生命周期管理器(当你没有指定另一个生命周期管理器时)。每次调用resolve时,瞬态生命周期管理器都会给您一个注册类型的NEW实例。还有其他生命周期管理器可以在注册期间指定,它们将提供不同的行为(单例等)