如何在 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 服务

Azure Functions:如何在 Azure 存储队列的绑定表达式中使用 POCO?

如何在 Azure 管道中运行 docker 容器?

Azure 网站如何访问 Azure 托管的虚拟机?