Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 配置WCF依赖项_C#_Wcf_Castle Windsor - Fatal编程技术网

C# 配置WCF依赖项

C# 配置WCF依赖项,c#,wcf,castle-windsor,C#,Wcf,Castle Windsor,我正在尝试在windows服务主机中托管WCF服务。为了管理依赖关系,我使用Castle WCF工具 以下是我的ContainerConfiguration(引导程序)的外观: public class ConfigureContainer : IConfigureContainer { private const string ServiceOne= "ServiceOne"; private const string Serv

我正在尝试在windows服务主机中托管WCF服务。为了管理依赖关系,我使用Castle 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

您需要在WCF ServiceHost中为WCF服务启动Windsor容器,而不是Windows服务代码。查看和上的这两篇博文,看看您需要做些什么。基本上,Windows服务代码只是启动了一个WCF ServiceHostFactory,您可以从Castle WCF设施中获得该工厂,而该工厂是Castle容器的实际配置对象。

如果您的意思是这样的话:var hostFactory=new DefaultServiceHostFactory(container.Kernel);var serviceHost=hostFactory.CreateServiceHost(“WcfServiceLibrary2.Service1”,新Uri[0]);serviceHost.Open();。。。这也不能解决我的问题。我建议您尝试创建一个代码版本,在Visual Studio web服务器、IIS Express或IIS下运行单个服务,并且能够使用Castle DI容器。一旦你解决了这个问题,你就会知道其他服务使用的模式以及在Windows服务下运行需要做什么。