我正在尝试将托管在 WAS 内的基于 netTcpBinding 的应用程序与 IoC 容器(autofac/spring)集成。不幸的是,当它在 WAS 中启动时,由于它不是基于 Http 的应用程序,因此在 Global 应用程序类中不会触发任何事件。
我需要捕获应用程序域启动,以便配置 IoC 容器。在 WAS 中托管时有什么方法可以做到这一点?
我已经看到了涉及在 App_Code 文件夹中使用静态类的可怕事情,但我想要一些更可测试且不那么脏的东西。
我正在尝试将托管在 WAS 内的基于 netTcpBinding 的应用程序与 IoC 容器(autofac/spring)集成。不幸的是,当它在 WAS 中启动时,由于它不是基于 Http 的应用程序,因此在 Global 应用程序类中不会触发任何事件。
我需要捕获应用程序域启动,以便配置 IoC 容器。在 WAS 中托管时有什么方法可以做到这一点?
我已经看到了涉及在 App_Code 文件夹中使用静态类的可怕事情,但我想要一些更可测试且不那么脏的东西。
您可以实现 IInstanceProvider(请参阅http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iinstanceprovider.aspx)并告诉 WCF 运行时通过服务行为使用它。
可以使用自定义主机、配置或属性来配置服务行为。这里是后者的一个例子:
public class DependencyInjectionServiceBehaviorAttribute : Attribute, IServiceBehavior
{
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (var cdb in serviceHostBase.ChannelDispatchers)
{
var cd = cdb as ChannelDispatcher;
if (cd != null)
{
foreach (EndpointDispatcher ed in cd.Endpoints)
{
ed.DispatchRuntime.InstanceProvider = new MyServiceFactory(serviceDescription.ServiceType);
}
}
}
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) {}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {}
}