WCF获取条目程序集
本文关键字:程序集 获取 WCF | 更新日期: 2023-09-27 17:58:21
我有一个WCF服务,比方说程序集a,它托管在IIS中。WCF服务引用了另一个程序集,比如说程序集B,它需要访问程序集a的assembly对象。
原因:我想用一个额外的约定和该约定的默认实现来扩展现有的WCF服务,该约定可以返回WCF服务程序集的FILE VERSION
请参阅下面的代码:
程序集A(WCF服务):
web.config:除了地址"B"下的现有2个端点之外,还添加了一个新端点
<configuration>
<system.serviceModel>
<services>
<service name="ExistingServiceHandler">
<endpoint address="mex" kind="mexEndpoint"/>
<endpoint address="" binding="basicHttpBinding" contract="IExistingContract"/>
<endpoint address="B" binding="basicHttpBinding" contract="AssemblyB.IServiceContract"/>
</service>
...
现有实现:现在从程序集B.扩展"实现"
public class ExistingServiceHandler : Implementation, IExistingContract
{
// Whatever methods are implemented here
}
程序集B(C#类库):
[ServiceContract]
public interface IServiceContract
{
[OperationContract]
string ServiceVersion();
}
public class Implementation : IServiceContract
{
public string ServiceVersion()
{
string assemblyLocation = Assembly.GetEntryAssembly().Location;
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assemblyLocation);
string fileVersion = fvi.FileVersion;
return fileVersion;
}
}
我尝试了以下(在程序集B中),但没有一个返回正确的程序集:
Assembly.GetEntryAssembly(); // returns NULL
Assembly.GetExecutingAssembly(); // returns assembly B
Assembly.GetCallingAssembly(); // returns System.ServiceModel
那么,如何获取程序集"A"(WCF服务)的程序集
注:
- 我想使用程序集B中的contract+实现,只需最少的工作量。这意味着我不想必须更改现有的服务实现,除了让类从新约定的默认实现(程序集B中的实现)扩展之外。提前感谢
程序集A似乎从未真正调用程序集B,只是扩展了它的类。因此,GetCallingAssembly
返回System.ServiceModel
(WCF)。我认为你需要检查this
的类型如下:
[ServiceContract]
public interface IServiceContract
{
[OperationContract]
string ServiceVersion();
}
public class Implementation : IServiceContract
{
public string ServiceVersion()
{
string assemblyLocation = this.GetType().Assembly.Location;
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assemblyLocation);
string fileVersion = fvi.FileVersion;
return fileVersion;
}
}
不应强制使用Reflection和Assembly.GetSomething
方法的正常方式。难道你不能将程序集A中的一些对象注入到具有接口(契约)共享程序集的程序集B方法中吗?这是一个非常非常粗略的解决方案:
组件A
class Service
{
public void ServiceMethod1()
{
// Here you create type from Assembly B but inject object from Assembly A
var obj = new SomeClass(new SomeSharedClass());
}
}
class SomeSharedClass : ISomeSharedContract
{
// SomeMethod implementation
}
组件B
class SomeClass
{
private ISomeSharedContract dependency;
public SomeClass(ISomeSharedContract dependency)
{
this.dependency = dependency;
}
private HereYourMethod(...)
{
// ...
this.dependency.SomeMethod(); // Here you gain access to Assembly A object
// ...
}
}
组件C-接口
interface ISomeSharedContract
{
void SomeMethod();
}
您可以通过使用一些常见的依赖注入容器来扩展此示例,如Unity、ninject或Windsor Castle。。。