3
我想在Windows服務主機中託管我的WCF服務。爲了管理依賴關係,我使用了Castle WCF工具。配置WCF依賴關係
這是我ContainerConfiguration(引導程序)的樣子:
public class ConfigureContainer : IConfigureContainer
{
private const string ServiceOne= "ServiceOne";
private const string ServiceTwo = "ServiceTwo";
private const string ServiceThree = "ServiceThree";
private const string CurrentAssembly = "MyAssembly";
private readonly IWindsorContainer container;
public ConfigureContainer(IWindsorContainer container)
{
this.container = container;
}
public IWindsorContainer WindsorContainer { get { return container; } }
public void AndRegisterComponents()
{
container.Register(AllTypes.FromAssemblyNamed(CurrentAssembly)
.Pick().If(type => type.GetInterfaces().Any(i => i.IsDefined(typeof(ServiceContractAttribute), true)))
.Configure(configurer => configurer
.Named(configurer.Implementation.Name)
.AsWcfService(
new DefaultServiceModel()
.AddEndpoints(
WcfEndpoint.FromConfiguration(ServiceOne),
WcfEndpoint.FromConfiguration(ServiceTwo),
WcfEndpoint.FromConfiguration(ServiceThree))
.PublishMetadata()))
.WithService.Select((type, baseTypes) => type.GetInterfaces()
.Where(i => i.IsDefined(typeof(ServiceContractAttribute), true))));
}
}
這是我做我的託管服務主機內:
partial class DataServicesHost : ServiceBase
{
private IWindsorContainer windsorContainer;
public DataServicesHost()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
var configure = new ConfigureContainer();
windsorContainer = configure.WindsorContainer;
}
protected override void OnStop()
{
if(windsorContainer != null)
{
windsorContainer.Dispose();
windsorContainer = null;
}
}
}
我ServiceOne被實現如下:
[ServiceContract]
internal interface IServiceOne
{
[OperationContract]
void DoSomething();
}
public class ServiceOne : IServiceOne
{
private readonly IDependency dependency;
public ServiceOne(IDependency dependency)
{
this.dependency = dependency;
}
public void DoSomething()
{
dependency.GetSomething();
//do something
}
}
public interface IDependency
{
void GetSomething();
}
public class Dependency : IDependency
{
public void GetSomething()
{
//GetSomeThing
}
}
現在我的問題是:如何將IDependency傳遞給容器?我將如何配置它,以便在託管它時,它不會抱怨不讓主機知道依賴關係,並且繼續查看和故障轉移默認的構造函數實現?
感謝, -Mike
如果你的意思是這樣的:var hostFactory = new DefaultServiceHostFactory(Container.Kernel); var serviceHost = hostFactory.CreateServiceHost(「WcfServiceLibrary2.Service1」,new Uri [0]); serviceHost.Open(); ...這也不解決我的問題。 – Mike
我建議您嘗試創建一個在Visual Studio Web服務器,IIS Express或IIS下運行單個服務的代碼版本,並且可以使用Castle DI容器。一旦你解決了這個問題,那麼你就會知道用於其他服務的模式,以及你需要做什麼來在Windows服務下運行。 –