简单注入器仅注册具有多参数构造函数的类的一个参数

问题描述 投票:0回答:1

我正在尝试为将在我的项目中使用的所有依赖关系解析器创建一个抽象类/层。这是一个更好地了解我的问题的图表:

而且我有Worker类(在本例中为ReactiveWorker),负责将不同的处理程序注册到容器和一些额外的操作。

enter image description here

worker类具有两个参数。在将此类注册到容器时,Simple Injector会引发以下异常:

ActivationException:类型为ReactiveWorker 的构造函数包含名称为'map'且参数类型为IMessageHandlerMap 的未注册参数。请确保已注册IMessageHandlerMap ,或更改ReactiveWorker 的构造函数。

这是我的注册代码:

//first registration
registrant.Register<IDependencyResolver>(LifeSpan.Scoped);

var t0 = new Func<IMessageHandlerMap<TChildModule>>(() => {
    var asm = typeof(TChildModule).Assembly;
    var t0 = Helper.FindConcreteImplementationsOf(asm, typeof(IMessageHandler<>))
    .Select(x => (message: [email protected]()[0],
            x.@interface,
            x.@class)).
            Select(x => (x.message, x.@class));
    return new MessageHandlerMap<TChildModule>(t0, typeof(DefaultUnknownMessageHandler));
});

//second registration
registrant.Register<IMessageHandlerMap<TChildModule>>(t0, LifeSpan.Scoped);

如果我尝试在第一个注册条目之前注册第二个注册条目,则会出现此异常:

ActivationException:ReactiveWorker 类型的构造函数包含名称为'resolver'且参数类型为IDependencyResolver的未注册参数。请确保已注册IDependencyResolver,或更改ReactiveWorker 的构造函数。

这是我的带有参数化构造函数的类:


public sealed class ReactiveWorker<TOwnerModule>: IWorker
{
    readonly IMessageHandlerMap<TOwnerModule> _map;
    readonly IDependencyResolver _resolver;

    public ReactiveWorker(IMessageHandlerMap<TOwnerModule> map, IDependencyResolver resolver)
    {
        _map = map;
        _resolver = resolver;
    }
}

我希望每个人都能理解情况。

c# .net dependency-injection ioc-container simple-injector
1个回答
0
投票

我正在尝试为将在我的项目中使用的所有依赖关系解析器创建一个抽象类/层。

这听起来好像您正在应用Service Locator anti-pattern。您可能要仔细检查您正在做的是依赖注入或服务位置,并在可能的情况下阻止服务位置。

此外,从已发布的注册中,您似乎要尝试实现批注册行为。 Simple Injector确实包含了此功能,值得对Simple Injector的API进行投资,以查看是否可以让工具完成这项工作。

例如,您的Helper.FindConcreteImplementationsOf看起来很像Simple Injector的Container.GetTypesToRegister方法。它返回给定类型的具体实现,例如:

Type[] types = container.GetTypesToRegister(typeof(IMessageHandler<>), asm);

简单注入器还允许将开放泛型抽象映射到开放泛型实现。例如,使用MessageHandlerMap<T>,您可以执行以下操作:

`container.Register(
    typeof(IMessageHandlerMap<>),
    typeof(MessageHandlerMap<>),
    Lifestyle.Scoped);

这确保每次请求MessageHandlerMap<T>的封闭版本时,都会创建IMessageHandlerMap<T>的封闭版本。但是,这确实依赖于Simple Injector的自动装配功能,这意味着Simple Injector必须能够将所有依赖项注入到类的构造函数中。这可能意味着您必须更改MessageHandlerMap<T>的构造函数才能让Simple Injector自动连接类型。

由于我不清楚MessageHandlerMap<T>的功能以及其实现的样子,因此我无法完全掌握您要实现的目标,因此无法为您提供更具体的建议关于更改设计。

祝你好运。>>

© www.soinside.com 2019 - 2024. All rights reserved.