gpt4 book ai didi

c# - Autofac 与 Web Api 集成时出错

转载 作者:行者123 更新时间:2023-11-30 22:05:52 26 4
gpt4 key购买 nike

我们有一个应用分为以下五个项目:

  • 只有 Html 页面的项目
  • 作为服务层的Web Api项目,只包含ApiController类
  • 业务层类库
  • 仅包含接口(interface)的业务层合约类库
  • 数据层类库
  • 一个数据层契约(Contract)类库,它也只包含接口(interface)

Web Api 服务包含对所有类库以及 Autofac 和 AutofacWebApiDependencyResolver 的引用。

我已经添加了必要的代码来注册容器和解析器,如 Autofac 文档中所述:

    var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;

目前我有一个非常基本的依赖层次结构来测试它,如下所示:

//On the data contracts
public interface IData
{
void SomeDataMethod();
}

//On the data layer
public class Data : IData
{
public void SomeDataMethod(){}
}

//On the business contracts
public interface IBusiness
{
void SomeBusinessMethod();
}

//On the business layer
public class Business : IBusiness
{
private readonly IData _data;

public Business(IData data)
{
_data = data;
}
}

//On the Web Api project
[EnableCors("*", "*", "*")]
public class MyController : ApiController
{
private IBusiness _business;

public MyController(IBusiness business)
{
_business = business;
}
}

所以这里根本没有火箭科学,但是当我运行该项目时,出现以下错误:

 XMLHttpRequest cannot load http://localhost:61101/api/MyController. No
'Access-Control-Allow-Origin' header is present on the requested
resource. Origin 'http://localhost:56722' is therefore not allowed
access.

如果我从 Controller 中删除构造函数,应用程序将完美运行, Controller 将被实例化并调用其 get 方法。

我做错了什么?

最佳答案

很明显,这个令人困惑的错误会让你相信它确实是一个没有启用 CORS 的问题,这是由于使用 Autofac Web Api 集成程序集注册你的 Controller 的代码是不够的,你也需要手动在所有其他程序集中注册所有依赖项。

所以 Global.asax 文件中的代码最终是这样的:

    var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
var appAssemblies = assemblies.Where(a => a.ToString().StartsWith("MyCustomer.MyApplicationName") && !a.ToString().Contains("Services")).ToArray();
builder.RegisterAssemblyTypes(appAssemblies).AsImplementedInterfaces();

var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;

之所以可行,是因为我的每个程序集都是按照约定命名的:

CustomerName.ApplicationName.LayerName

因此,我希望我的所有类型的应用程序程序集(服务程序集除外)都在 Autofac 中注册。

关于c# - Autofac 与 Web Api 集成时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24024737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com