在C#项目中,我需要使用Azure Service Bus实现SignalR的背板。所以我在创业公司写道:
GlobalHost.DependencyResolver.UseServiceBus(asb_endpoint, topic);
在同一个项目中,甚至还有Azure Service Bus的Rebus配置,如:
return Rebus.Config.Configure.With(new UnityContainerAdapter(container))
.Logging(l => l.Log4Net())
.Transport(l => l.UseAzureServiceBus(cs, qname))
.Routing(r => r.TypeBasedRoutingFromAppConfig())
.Options(o => o.SimpleRetryStrategy(errorQueueAddress: errorqname, maxDeliveryAttempts: 3));
都使用扩展方法来实现UseAzureServiceBus
和UseServiceBus
。
问题是:两个扩展方法都是两个库的一部分,并且这个库在各种依赖项上存在冲突。要使Rebus'UseAzureServiceBus
扩展,我需要Rebus.AzureServiceBus
版本0.99.39,而这至少需要WindowsAzure.ServiceBus
3.0.4,但这会使用名为Microsoft.ServiceBus
3.0的DLL .0与扩展方法UseServiceBus的内部工作冲突。
我该如何处理?
编辑1 :看起来此问题将通过Microsoft.AspNet.SignalR.ServiceBus
version 2.2.2修复。我不知道该怎么办
答案 0 :(得分:1)
听起来你需要给每个程序集一个别名,然后你可以专门使用该版本中的类。
请参阅:
What use is the Aliases property of assembly references in Visual Studio 8
MSDN: https://msdn.microsoft.com/en-us/library/ms173212.aspx
这是一个很好的演练: https://blogs.msdn.microsoft.com/ansonh/2006/09/27/extern-alias-walkthrough/
extern alias FooVersion1;
FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo();
f.Bar();
您拥有的另一个选项是使用默认情况下打开的全局别名,然后您可以使用global,然后使用您需要使用的类的完整命名空间(如果它存在于2个不同的程序集中)。
例如:
global::Assembly1.Class1 c = new global::Assembly1.Class1();
global::Assembly2.Class1 c2 = new global::Assembly2.Class1();