3

Windows サービス ホストで WCF サービスをホストしようとしています。依存関係を管理するために、Castle WCF 機能を使用しています。

これは私の ContainerConfiguration(BootStrapper) がどのように見えるかです:

 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 をコンテナーに渡すにはどうすればよいですか? ホストしているときに、ホストに依存関係を知らせないことについて不平を言わず、デフォルトのコンストラクターの実装を探して失敗し続けるように、どのように構成しますか?

ありがとう -マイク

4

1 に答える 1

1

Windows サービス コードではなく、WCF ServiceHost内で WCF サービスの Windsor コンテナーを起動する必要があります。Castle WCF 機能Windows サービスのWCFに関する次の 2 つのブログ投稿を見て、何をする必要があるかを確認してください。基本的に、Windows サービス コードは、Castle WCF 機能から取得した WCF ServiceHostFactory をスピンアップするだけであり、そのファクトリが実際に Castle コンテナーを構成します。

于 2012-06-15T12:53:54.790 に答える