使用TinyIoC解析带有构造函数参数的具体类型

本文关键字:参数 类型 构造函数 TinyIoC 使用 | 更新日期: 2023-09-27 17:51:03

我有一个南希API,并创建了一个自定义引导程序继承自DefaultNancyBootstrapper

我也有具体类型ConcreteFoo,我想在请求范围内绑定到self,并传递一个特定的构造函数参数。

public class ConcreteFoo {
    private readonly int _baseInteger;
    public ConcreteFoo(int baseInteger) {
        _baseInteger = baseInteger;
    }
}

我的自定义引导程序如下:

public class Bootstraper : DefaultNancyBootstrapper {
    protected override void ConfigureApplicationContainer(TinyIoCContainer container) {
        base.ConfigureApplicationContainer(container);
    }
    protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context) {
        base.ConfigureRequestContainer(container, context);
        container.Resolve<ConcreteFoo>(new NamedParameterOverloads {{"baseInteger", 100}});
    }
}

为了用所需的构造函数参数解决ConcreteFoo,我使用了TinyIoC Wiki中提供的示例。我注意到代码从自定义引导程序中的覆盖传递,如果我写下面的代码,则response为真。

var response = container.CanResolve<ConcreteFoo>(new NamedParameterOverloads {{"baseInteger", 100}});

然而,当应用程序引导时,我得到一个异常。inner-inner-inner……下面列出了(lot's of inner)异常,并指出它无法创建ConcreteFoo,也无法解析System.Int32

InnerException: Nancy.TinyIoc.TinyIoCResolutionException
  HResult=-2146233088
  Message=Unable to resolve type: TestService.Api.ConcreteFoo
  Source=Nancy
  StackTrace:
       at Nancy.TinyIoc.TinyIoCContainer.ConstructType(Type requestedType, Type implementationType, ConstructorInfo constructor, NamedParameterOverloads parameters, ResolveOptions options)
       at Nancy.TinyIoc.TinyIoCContainer.MultiInstanceFactory.GetObject(Type requestedType, TinyIoCContainer container, NamedParameterOverloads parameters, ResolveOptions options)
  InnerException: Nancy.TinyIoc.TinyIoCResolutionException
       HResult=-2146233088
       Message=Unable to resolve type: System.Int32
       Source=Nancy
       StackTrace:
            at Nancy.TinyIoc.TinyIoCContainer.ConstructType(Type requestedType, Type implementationType, ConstructorInfo constructor, NamedParameterOverloads parameters, ResolveOptions options)
            at Nancy.TinyIoc.TinyIoCContainer.ConstructType(Type requestedType, Type implementationType, NamedParameterOverloads parameters, ResolveOptions options)
            at Nancy.TinyIoc.TinyIoCContainer.ResolveInternal(TypeRegistration registration, NamedParameterOverloads parameters, ResolveOptions options)

我发现了这个相关的问题,但它指的是注册一个接口而不是一个具体的类型。

是我做错了什么,还是你熟悉另一种解决具体类型并提供构造函数参数的方法?

使用TinyIoC解析带有构造函数参数的具体类型

我认为你需要container.Register…

无论如何,最近我更喜欢使用IRegistration类,它是由Nancy自动连接的。这样,这些东西就可以按主题/关注点分开,并且根本不会修改bootstrapper。