C# 将内部类注入Azure WebJob函数
WebJob项目中的默认C# 将内部类注入Azure WebJob函数,c#,azure,unity-container,azure-webjobs,C#,Azure,Unity Container,Azure Webjobs,WebJob项目中的默认函数类是否有办法成为内部?我们正在使用作业激活器通过Unity注入一些内部依赖项,这要求函数类也是内部。运行web作业时,我们看到以下错误: 未找到作业函数。试着公开你的作业类和方法。如果您使用的是绑定扩展(例如ServiceBus、Timers等),请确保在启动代码(例如config.UseServiceBus()、config.UseTimers()等)中调用了扩展的注册方法。 当我们将所有依赖项公开时,它工作正常,因此我知道触发器或作业主机配置没有问题 这是我的课程
函数
类是否有办法成为内部
?我们正在使用作业激活器通过Unity注入一些内部
依赖项,这要求函数
类也是内部
。运行web作业时,我们看到以下错误:
未找到作业函数。试着公开你的作业类和方法。如果您使用的是绑定扩展(例如ServiceBus、Timers等),请确保在启动代码(例如config.UseServiceBus()、config.UseTimers()等)中调用了扩展的注册方法。
当我们将所有依赖项公开时,它工作正常,因此我知道触发器或作业主机配置没有问题
这是我的课程:
class Program
{
static void Main()
{
var config = new JobHostConfiguration
{
JobActivator = new Activator(new UnityContainer())
};
config.UseServiceBus();
var host = new JobHost(config);
host.RunAndBlock();
}
}
下面是我的Functions类的简化版本:
internal class Functions
{
private readonly IMyInternalDependency _dependency;
public Functions(IMyInternalDependency dependency)
{
_dependency = dependency;
}
public function DoSomething([ServiceBusTrigger("my-queue")] BrokeredMessage message)
{
// Do something with the message
}
}
必须将函数
类公开。这似乎正是Azure WebJobs的工作原理。您不需要公开具体的内部类。只是界面:
public interface IDoStuffPublically
{
void DoSomething();
}
interface IDoStuffInternally
{
void DoSomething();
void DoSomethingInternally();
}
class DoStuff : IDoStuffPublically, IDoStuffInternally
{
public void DoSomething()
{
// ...
}
public void DoSomethingInternally()
{
// ...
}
}
然后你的函数
类:
public class Functions
{
public Functions(IDoStuffPublically stuff)
{
_stuff = stuff;
}
private IDoStuffPublically _stuff;
// ...
}
团结会做这样的事情:
var job = new Functions(new DoStuff());
戴夫评论道:
令人沮丧的是,我不能简单地设置WebJob SDK可见的内部组件
你也许能做到这一点。。。Miiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
程序集或可执行文件可以通过某种方式授予另一个程序集访问内部成员的权限。我以前在类库上这样做过,以允许我的单元测试在设置单元测试时调用类的内部方法
如果您知道Azure WebJobs中的哪个程序集实际创建了Functions类的实例,以及调用该类上的方法的程序集,则可以将这些程序集列为白名单
打开AssemblyInfo.cs并添加一行或多行:
[assembly: InternalsVisibleTo("Microsoft.Azure.Something.Something")]
参考:
相关阅读:
但是,我不确定您需要添加哪些程序集。在Webjob SDK中使用触发器时,您从不注册要执行的函数
当jobhost启动时(newjobhost(config).RunAndBlock()
),它会根据参数属性发现要执行的函数
让我们看看您的代码:
var config = new JobHostConfiguration
{
JobActivator = new Activator(new UnityContainer())
};
config.UseServiceBus();
因为您指定要使用servicebus,所以当jobhost启动时,它将发现并注册(索引)具有ServiceBusTrigger
属性参数的所有函数
我假设SDK使用了类似的方法来索引函数,因此不知道从内部类获取属性是否(可能且)容易。我对WebJobs不太了解,但您可以让一个私有或内部类实现一个公共接口,并将该对象作为其接口传递。您是否可以发布一些代码,或者是一个获取上下文的代码示例?我不能简单地设置WebJob SDK可见的内部构件,这让人沮丧,但是很好。这似乎是最好的解决办法。谢谢。在AssemblyInfo.cs文件中,您可以使内部
对另一个程序集可见。我想知道这是否可行,只要你知道WebJob是从哪个程序集运行的…@Dave:我已经用可能的解决方案的说明更新了我的问题。实际上我在发布之前就试过了,但没有用。当然,我可能没有偶然发现正确的程序集名称,但我尝试了以下操作,但均无效:Microsoft.Azure.WebJobs、Microsoft.Azure.WebJobs.Host、Microsoft.Azure.WebJobs、Microsoft.Azure.WebJobs.ServiceBus和Microsoft.Azure.WebJobs.Host.Executors