WebserviceFacility.cs
Code
using System;
using System.Collections.Generic;
using System.Text;
using Castle.MicroKernel.Facilities;
using Castle.Core;
namespace Castle.Facilities.WebserviceIntegration
{
public class WebserviceFacility:AbstractFacility
{
protected override void Init()
{
Kernel.AddComponent<WebserviceInterceptor>();
Kernel.ComponentModelCreated += new Castle.MicroKernel.ComponentModelDelegate(Kernel_ComponentModelCreated);
}
void Kernel_ComponentModelCreated(ComponentModel model)
{
model.CustomComponentActivator = typeof(WebserviceClientActivator);
model.Interceptors.Add(new InterceptorReference(typeof(WebserviceInterceptor)));
}
}
}
WebserviceClientActivator.cs
Code
using System;
using System.Collections.Generic;
using System.Text;
using Castle.MicroKernel.ComponentActivator;
using Castle.Core;
using Castle.MicroKernel;
using Castle.Core.Configuration;
using Castle.Facilities.WebserviceIntegration.WebserviceProxy;
using Castle.MicroKernel.Proxy;
namespace Castle.Facilities.WebserviceIntegration
{
public class WebserviceClientActivator : DefaultComponentActivator
{
public WebserviceClientActivator(ComponentModel model, IKernel kernel,
ComponentInstanceDelegate onCreation, ComponentInstanceDelegate onDestruction)
: base(model, kernel, onCreation, onDestruction)
{
}
protected override object Instantiate(CreationContext context)
{
try
{
IConfiguration config = context.Handler.ComponentModel.Configuration;
string address = config.Attributes["address"];
WebserviceClient proxy = new WebserviceClient();
Type t = proxy.Create(address,Model.Implementation);
object instance = t.Assembly.CreateInstance(t.FullName);
instance = Kernel.ProxyFactory.Create(Kernel, instance, Model);
return instance;
}
catch (Exception ex)
{
throw new ComponentActivatorException("WebserviceClientActivator: could not proxy service " +
Model.Service.FullName, ex);
}
}
}
}
这个Custom Facility 可以实现webservice 集成到castle中。