热门注册已构建的实例统一?

时间:2013-05-04 06:16:08

标签: .net unity-container

我尝试在将它注册为unity之前构造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>();

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

HttpClient(HttpMessageHandler handler, bool disposeHandler);

HttpMessageHandler是抽象类,所以我认为这是我的代码在运行时失败的问题。 那么,我怎样才能控制统一使用哪个构造或者是否有一种方法可以使用已构造的实例?

1 个答案:

答案 0 :(得分:0)

  

似乎Unity使用具有最多参数的构造函数创建另一个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>());