注册特定的模块构造函数



我想将不同的字符串注入到我的每个模块的构造器中。我注册了一个构造模块的工厂方法。然后我可以打电话给container.Resolve<T>(),一切都很好。出于某种原因,当南希尝试解决我的模块时,它会抛出错误

Nancy.TinyIoc.TinyIoCResolution异常:无法解析类型: Plugin.HomeModule ---> Nancy.TinyIoc.TinyIoCResolutionException: 无法解析类型:系统字符串

public class HomeModule : NancyModule
{
    public HomeModule(string text)
    {
    }
}
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
    base.ConfigureApplicationContainer(container);
    container.Register<HomeModule>((ctr, param) => { return new HomeModule("text"); });
    HomeModule module = container.Resolve<HomeModule>();
}

我也尝试在ConfigureRequestContainer()进行注册,结果相同。我尝试过container.Register<HomeModule>(new HomeModule("some text"));AsSingleton(). 我可以使用 container.Register<string>("text") 注册字符串类型的实现,但这会将相同的字符串注入所有模块。

如何注册模块构造函数以便 Nancy 可以解析它?

模块是通过 INancyModuleCatalog 获得的,该目录通常由引导程序实现,您必须创建该目录的自定义变体 - 如果您使用的是默认引导程序,那么这是当前的实现:

https://github.com/NancyFx/Nancy/blob/master/src/Nancy/DefaultNancyBootstrapper.cs#L205

最好的方法是不要将原语传入您的模块,而是传递更丰富的内容,或者可能是工厂。容器可以解析这些依赖项。将纯字符串传递到模块中是其他地方出现问题的标志,并暗示您的架构可能需要重新考虑

我已经实现了一个自定义目录,该目录仅注册特定命名空间的模块,但我不知道在哪里注册它。

public CustomModuleCatalog()
{
    // The license type is read from db in Global.ascx.
    // So I want to register a module based on a namespace. 
    // The namespace is the same like the license name.
    if(WebApiApplication.LicenseType == LicenseType.RouteOne)
    {
        var assemblyTypes = Assembly.GetExecutingAssembly().GetTypes();
        var modules = assemblyTypes.Where(t => t.Namespace != null && t.Namespace.EndsWith("MyCustomNamespace"));
        var nancy = modules.Where(t => t.IsAssignableFrom(typeof(INancyModule)));
        foreach (var type in nancy)
        {
            var nancyType = (INancyModule)type;
            _modules.Add(type, (INancyModule)Activator.CreateInstance(type));
        }
    }
}
public IEnumerable<INancyModule> GetAllModules(NancyContext context)
{
    return _modules?.Values;
}
public INancyModule GetModule(Type moduleType, NancyContext context)
{
    if (_modules != null && _modules.ContainsKey(moduleType))
    {
        return _modules[moduleType];
    }
    return null;
}

相关内容

  • 没有找到相关文章

最新更新