Unity RegisterType用于自己接受服务的构造函数

本文关键字:服务 构造函数 RegisterType 用于 自己 Unity | 更新日期: 2023-09-27 18:11:36

我有两个服务IServiceA和IServiceB。IServiceB的具体实现如下所示:

public class ServiceB : IServiceB {
    public ServiceB(string path, IServiceA serviceA) { ... }
}

所以我需要传入一个字符串和一个ServiceA

我不知道该怎么做。我现在就有这个:

var path = _config.Path;
container.RegisterType<IServiceA, ServiceA>();
container.RegisterType<IServiceB, ServiceB>(
            new InjectionConstructor(path, container.Resolve<IServiceA>());

这显然是错误的,因为我实际上是在实例化一个ServiceA,并将一个实例注册为所有ServiceB。

我如何告诉Unity总是解决一个"新鲜"的服务?我试着从RegisterType中删除IServiceA,这会抛出一个异常,告诉我没有ctor(string),这是正确的,因为它是ctor(string,IServiceA)

Unity RegisterType用于自己接受服务的构造函数

没有特别详细的文档说明,但这似乎可以工作:

container.RegisterType<IServiceA, ServiceA>();
container.RegisterType<IServiceB, ServiceB>(
        new InjectionConstructor(path, new ResolvedParameter<IServiceA>()));

我建议在生产环境中使用它之前先测试一下。

相信你也能做到:

container.RegisterType<IServiceA, ServiceA>();
container.RegisterType<IServiceB, ServiceB>(
        new InjectionConstructor(path, typeof(IServiceA)));