ExampleClientHelper替换上述参考示例中的所有请求/响应.它在内部使用RestSharp.
[Test]
[Ignore]
public void ValuesHelper_ShouldReturn_value1_And_value2_AsTypedObject()
{
// IoC prep
var builder = new ContainerBuilder();
var container = builder.Build();
// web server prep
var baseUri = new Uri("http://localhost:8080");
var config = new HttpSelfHostConfiguration(baseUri);
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
// yes, the routing needs to be copied over. it's not compatible with the MVC routes
config.Routes.MapHttpRoute("Api", "api/{controller}/{id}",
new { id = RouteParameter.Optional, namespaces = new[] { typeof(ValuesController).Namespace } });
// start the server and make a request
new HttpSelfHostServer(config)
.OpenAsync()
.ContinueWith(task =>
{
var client = new ExampleClientHelper(baseUri);
var values = client.GetValues();
// then test the response
Assert.AreEqual("value1", values.ElementAt(0));
Assert.AreEqual("value2", values.ElementAt(1));
})
.Wait();
}
只要不修改ValuesController,上面的代码就可以正常工作.即.它仍然具有隐式无参数构造函数.
我遇到的问题是,当我修改它以要求依赖时,自我主机服务器似乎无法实例化我的ValuesController.问题是,无论是否连接Autofac DependencyResolver,我从助手客户端的响应中得到了相同的异常.这是响应内容中返回的内容,由于RestSharp,格式化为JSON:
{“ExceptionType”:”System.ArgumentException”,”Message”:”Type ‘Embed.ECSApi.RestServer.Controllers.ValuesController’ does not have a default constructor”,”StackTrace”:” at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)”}
很明显,自主服务器正在尝试创建ValuesController,但它不能.为什么?我以为我正确连接了DependencyResolver.我期待得到一个Autofac异常而不是抱怨我没有配置的依赖.
看起来您忘记使用容器注册控制器,Web API正在尝试为您创建实例.var builder = new ContainerBuilder(); // Register API controllers using assembly scanning. builder.RegisterApiControllers(typeof(ValuesController).Assembly); var container = builder.Build();
如果需要,您还可以注册单个控制器.
