我正在尝试将 nancy 与 JSON.net 一起使用,请按照我找到的 2 种方法来注册依赖项,但一直让我进入 InvalidOperationException,并显示一条消息"在组合过程中尝试满足其中一个依赖项时出错,请确保您已在容器中注册了所有新的依赖项并检查 innerexception 以获取更多详细信息。 南希.南希引擎"}.
我正在使用自托管来运行南希和吉普车,一切都非常简单,只需进行测试即可。
public static void Main(string[] args)
{
try
{
var host = new NancyHost(new Uri("http://localhost:8888/"));
host.Start(); // start hosting
Console.ReadKey();
host.Stop(); // stop hosting
}
catch
{
throw;
}
}
首先我创建一个自定义序列化程序
public class CustomJsonSerializer : JsonSerializer
{
public CustomJsonSerializer()
{
ContractResolver = new CamelCasePropertyNamesContractResolver();
Formatting = Formatting.Indented;
}
}
然后我尝试了 2 种注册方式使用集成:
public class JsonRegistration : IRegistrations
{
public IEnumerable<TypeRegistration> TypeRegistrations
{
get
{
yield return new TypeRegistration(typeof(JsonSerializer), typeof(CustomJsonSerializer));
}
}
public IEnumerable<CollectionTypeRegistration> CollectionTypeRegistrations { get; protected set; }
public IEnumerable<InstanceRegistration> InstanceRegistrations { get; protected set; }
}
并且还使用引导程序
public class NancyBootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container);
container.Register<JsonSerializer, CustomJsonSerializer>();
}
}
这意味着在自托管时,我添加了自定义引导程序
var host = new NancyHost(new Uri("http://localhost:8888/"), new NancyBootstrapper());
两种方式都返回相同的错误。
问题实际上是版本,nancy json.net 软件包使用的是 Newton.Json 6.0.0.0,但是在安装软件包时,它会自动安装会产生此问题的较新版本。不确定Newton.JSON中有什么变化会实际创建这个。
https://github.com/NancyFx/Nancy.Serialization.JsonNet/issues/27
只是为了补充我在这个领域来之不易的知识,在使用 Nancy 1.4.1 非常令人沮丧的几个小时之后。
如果使用自定义引导程序,请确保在开始自定义注册之前调用base.ConfigureApplicationContainer(container);
。
所以,不是:
public class MyCustomBootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
// MY BITS HERE...
base.ConfigureApplicationContainer(container);
}
}
但
public class MyCustomBootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container); // Must go first!!
// MY BITS HERE...
}
}
如果不这样做,将收到以下错误:
尝试满足其中一个依赖项时出错 在合成过程中,请确保您已注册所有新的 容器中的依赖项并检查内部异常以获取更多信息 详。
有一个有用的内部例外:
无法解析类型:南希.南希引擎
更改这些 C# 语句顺序的解决方案实际上在 @StevenRobbins 的出色回答中有所提及(如果我第一次正确阅读,我可以为自己节省几个小时的痛苦)。
史蒂文说:
在手动注册后调用"base",您就是 通过自动注册有效地复制您的原始注册。 要么不要打电话给基地,要么在你做你的手册之前打电话给它 注册。