如何在 Azure TableController 中注入公共服务依赖项
Posted
技术标签:
【中文标题】如何在 Azure TableController 中注入公共服务依赖项【英文标题】:How to inject Common Service Dependency in Azure TableController 【发布时间】:2020-03-26 10:13:12 【问题描述】:我正在尝试在 TableController 中注入 CommonService 依赖项,如下所示,如果我调用像“http://localhost:61558/api/TodoItem”这样的表控制器端点,它可以正常工作。
但是,当我使用“http://localhost:61558/tables/TodoItem”调用同一端点时会引发错误(移动应用 SDK 调用此 URL 以同步数据的正确方式)
例外: "ExceptionType": "System.InvalidOperationException"
ExceptionMessage:“尝试创建 'TodoItemController' 类型的控制器时发生错误。请确保控制器具有无参数的公共构造函数。”,
Startup.cs
public partial class Startup
public void ConfigureAuth(IAppBuilder app)
HttpConfiguration config = new HttpConfiguration();
new MobileAppConfiguration()
.AddMobileAppHomeController()
.MapApiControllers()
.AddTables(new MobileAppTableConfiguration()
.MapTableControllers()
.AddEntityFramework()
)
.ApplyTo(config);
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
app.UseWebApi(config);
我已经正确配置了 DIUnityConfig:
public static void RegisterComponents()
var container = new UnityContainer();
container.RegisterType(typeof(ICommonService), typeof(CommonService));
Current = container;
这是表控制器代码:
[Authorize]
public class TodoItemController : TableController<TodoItem>
private readonly ICommonService _ICommonService;
public TodoItemController(ICommonService commonService)
_ICommonService = commonService;
protected override void Initialize(HttpControllerContext controllerContext)
base.Initialize(controllerContext);
MobileServiceContext context = new MobileServiceContext();
DomainManager = new EntityDomainManager<TodoItem>(context, Request, enableSoftDelete: true);
// PATCH tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959
public async Task<TodoItem> PatchTodoItem(string id, Delta<TodoItem> patch)
var item = await UpdateAsync(id, patch);
await PushToSyncAsync("todoitem", item.Id);
_ICommonService.SendMail();// Want to send mail on business logic.
return item;
【问题讨论】:
您的控制器代码没问题。似乎容器配置代码很好。请检查您是否已将 Unity 注入到控制器创建管道中。RegisterComponents
被执行
@oleksa 谢谢。我在 Global.asax 的 Application_Start 方法中调用 UnityConfig.RegisterComponents()。它应该被注入所有服务。
您好像忘记设置DependencyResolver.SetResolver
App_Start 中的 MobileAppConfiguration 是什么样的?这对于正确连接桌面控制器至关重要。你需要类似new MobileAppConfiguration().UseDefaultConfiguration().ApplyTo(config);
@AdrianHall 我的 App_Start 带有以下代码行: new MobileAppConfiguration() .AddMobileAppHomeController() .MapApiControllers() .AddTables(new MobileAppTableConfiguration() .MapTableControllers() .AddEntityFramework() ) .ApplyTo(配置);
【参考方案1】:
您的表控制器不完整。您需要将 HttpControllerContext 传递给构造函数,然后传递给基础。这样的事情很正常:
public class DatesController : TableController<Dates>
protected override void Initialize(HttpControllerContext controllerContext)
base.Initialize(controllerContext);
var context = new AppDbContext();
DomainManager = new EntityDomainManager<Dates>(context, Request);
// Rest of your controller here
如果不调用Initialize()
,您的表控制器将永远不会注册。
【讨论】:
您可以在上面的代码中看到我的 Table 控制器,它与您所说的相似。 我看到您也在使用构造函数,但没有使用: base()
调用基本构造函数以上是关于如何在 Azure TableController 中注入公共服务依赖项的主要内容,如果未能解决你的问题,请参考以下文章
在 Azure 数据工厂中完成活动后,如何向 Azure 服务总线发送消息
如何使用 Azure Function 在 Azure 文件共享中解压缩文件?
如何在 c# 中为 SQL Azure 启用内部 Azure 服务