4

从这里得到了提示,为我的新 Web Api 项目提出了这个集成测试。我正在尝试构建一个 REST Web 服务,并且我有一个助手客户端,我计划发布给 API 消费者。那是ExampleClientHelper那里的类型。哦,顺便说一句,这一切都ValuesController与 MVC4 Web Api Visual Studio 项目的项目模板一起提供的内容有关——我在搞清楚这一点时会保持简单。

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. IE。它仍然有一个隐式的无参数构造函数。

ValuesController我遇到的问题是,当我将其修改为需要依赖项时,自托管服务器似乎无法实例化我的。问题是,无论我是否连接Autofac DependencyResolver ,我都会从我的助手客户端的响应中得到相同的异常。这是响应内容中返回的内容,由于 RestSharp,它被很好地格式化为 JSON:

{"ExceptionType":"System.ArgumentException","Message":"Type 'Embed.ECSApi.RestServer.Controllers.ValuesController' 没有默认构造函数","StackTrace":" 在 System.Linq.Expressions.Expression。新建(类型类型)\r\n 在 System.Web.Http.Internal.TypeActivator.Create[TBase](类型 instanceType)\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor controllerDescriptor , 类型控制器类型)"}

很明显,自托管服务器正在尝试创建ValuesController,但它不能。为什么?我以为我正确连接了 DependencyResolver。我希望得到一个 Autofac 异常,而不是抱怨我没有配置的依赖项。

4

1 回答 1

2

您似乎忘记向容器注册控制器,而 Web API 正在尝试为您创建实例。

var builder = new ContainerBuilder();

// Register API controllers using assembly scanning.
builder.RegisterApiControllers(typeof(ValuesController).Assembly);

var container = builder.Build();

如果需要,您还可以注册单个控制器。

于 2012-07-26T11:59:39.277 回答