我喜欢回答我自己的问题。
在当前的解决方案中,UnityInstanceProvider是硬编码的,所有我必须扩展初始化,以便可以覆盖。
public class UnityBehaviorExtensionElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new UnityServiceBehavior()
{
InstanceProviderFunc = InstanceProviderFunc(),
ContainerName = this.ContainerName,
ContextChannelEnabled = this.ContextChannelEnabled,
InstanceContextEnabled = this.InstanceContextEnabled,
OperationContextEnabled = this.OperationContextEnabled,
ServiceHostBaseEnabled = this.ServiceHostBaseEnabled
};
}
protected virtual Func<Type, string, UnityInstanceProvider> InstanceProviderFunc()
{
return (type, str) => new UnityInstanceProvider(type, str, UnityInstanceProvider.CreateUnityContainer);
}
}
UnityServiceBehavior: IServiceBehavior
{
....
public Func<Type, string, UnityInstanceProvider> InstanceProviderFunc;
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
...
foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
if (channelDispatcher != null)
{
foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints)
{
endpointDispatcher.DispatchRuntime.InstanceProvider =
InstanceProviderFunc(serviceDescription.ServiceType, this.ContainerName);
....
}
现在我可以定义自己的BehaviorExtensionElement我的服务项目中,并覆盖InstanceProviderFunc
public class TestClientBehaviorExtensionElement:UnityBehaviorExtensionElement
{
protected override Func<Type, string, UnityInstanceProvider> InstanceProviderFunc()
{
return (type, str) => new UnityInstanceProvider(type, str, CreateUnityContainer);
}
///<summary>
///</summary>
///<param name="containerName"></param>
///<returns></returns>
public IUnityContainer CreateUnityContainer(string containerName)
{
IUnityContainer unityContainer = new UnityContainer();
try
{
unityContainer.RegisterType<IOperationContextService, OperationContextService>(new UnityOperationContextLifetimeManager());
...
}
catch (Exception)
{
unityContainer.Dispose();
throw;
}
return unityContainer;
}