0

我尝试在统一注册之前构建 HttpClient,但它在运行时失败,错误消息显示 HttpMessageHandler 无法访问。

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:3721");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
IUnityContainer container = new UnityContainer();
container.RegisterInstance<HttpClient>(client);
IUnityContainer newcontainer = new UnityContainer();
HttpClient newclient = newcontainer.Resolve<HttpClient>();

似乎统一使用具有最多参数的构造函数创建了另一个 HttpClient 实例。

HttpClient(HttpMessageHandler handler, bool disposeHandler);

HttpMessageHandler 是抽象类,所以我认为这是我的代码在运行时失败的问题。那么,我如何控制统一使用哪个构造,或者有没有办法让统一使用已经构造的实例?

4

1 回答 1

0

似乎统一使用具有最多参数的构造函数创建了另一个 HttpClient 实例。

是的,默认情况下 Unity 使用具有最大签名的构造函数。

那么,我怎样才能控制统一使用哪个构造函数呢?

使用 InjectionConstructor:newContainer.RegisterType<HttpClient>(new InjectionConstructor()); 这告诉 Unity 使用无参数构造函数。

或者有没有办法统一使用已经构建的实例?

使用 RegisterInstance:container.RegisterInstance<HttpClient>(client);


警告

如果您创建一个新容器,这个容器不会与第一个容器共享注册:

MyObject instance = new MyObject();
IUnityContainer container = new UnityContainer();
container.RegisterInstance<MyObject>(instance);

Assert.AreSame(instance, container.Resolve<MyObject>());

IUnityContainer newcontainer = new UnityContainer();
Assert.AreNotSame(instance, newcontainer.Resolve<MyObject>());
于 2013-05-06T14:35:51.980 回答