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

时间:2015-05-28 15:11:27

标签: c# nancy tinyioc

我有一个Nancy API并创建了一个继承自DefaultNancyBootstrapper的自定义Bootstraper。

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

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

我的自定义Bootstraper如下:

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}});

然而,当应用程序引导时,我得到异常。内部 - 内部......(内部的很多)例外列在下面,并指出它无法创建ConcreteFoo并且它无法解析System.Int32。< / p>

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)

我找到了this相关问题,但它指的是注册接口而不是具体类型。

我做错了什么,或者您是否熟悉解决具体类型并提供构造函数参数的其他方法?

1 个答案:

答案 0 :(得分:2)

我认为你需要container.Register ...

无论如何,最近我更喜欢使用由Nancy自动连接的IRegistration类。这样事情就会被主题/关注点分开,并且根本不会修改引导程序。