2015-05-28 84 views
2

我有一个Nancy API并创建了一个自定义的从DefaultNancyBootstrapper继承的Bootstraper。使用TinyIoC解析具有构造函数参数的具体类型

我也有具体的类型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}}); 
    } 
} 

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

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

但是,我得到一个异常在该应用的Bootstrap。下面列出内部内部内部(内部很多)异常,并声明它不能创建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) 

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

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

回答

2

我想你需要container.Register ...

反正最近我更喜欢使用IRegistration类,这是自动有线南希。这样的话,事情就会被主题/关注点分开,而引导程序根本就不会被修改。

+0

我已经试过了,失败了。然后我切换到解决。然而,真正的问题来自这样的事实:在SetApplicationContainer()中,我有一个Singleton(默认为Interfaces),它试图使用InRequestScope ConcreteFoo。我将Singleton更改为MultiInstance,并像注册表一样工作。感谢您的帮助。 – Manolis

相关问题