我想将不同的字符串注入到我的每个模块的构造器中。我注册了一个构造模块的工厂方法。然后我可以打电话给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;
}