Windows 서비스 호스트에서 내 WCF 서비스를 호스팅하려고합니다. 종속성을 관리하기 위해 Castle WCF 기능을 사용하고 있습니다.WCF 종속성 구성
내 ServiceOne가로 구현됩니다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;
}
}
}
은 다음과 같습니다 :
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))));
}
}
이것은 내가 나의 서비스 호스트 내부에서 호스팅 할 방법은 다음과 같습니다 내 ContainerConfiguration (부트 스트 래퍼)처럼 보이는 방법
이입니다
[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를 전달하려면 어떻게해야합니까? 호스트를 구성하는 동안 호스트가 종속성을 알지 못하게하고 기본 생성자 구현을보고 실패하는 것에 대해 불평하지 않도록 어떻게 구성합니까?
덕분에, - 마이크
다음과 같은 경우 : var hostFactory = new DefaultServiceHostFactory (Container.Kernel); var serviceHost = hostFactory.CreateServiceHost ("WcfServiceLibrary2.Service1", 새 Uri [0]); serviceHost.Open(); ...이 또한 내 문제를 해결하지 않습니다. – Mike
Visual Studio 웹 서버, IIS Express 또는 IIS에서 단일 서비스를 실행하고 Castle DI 컨테이너를 사용할 수있는 코드 버전을 생성 해보십시오. 이 문제를 해결하면 다른 서비스에 사용할 패턴과 Windows 서비스에서 실행하기 위해 수행해야 할 작업을 알 수 있습니다. –