c# - 使用 CaSTLe windsor 解析 WCF service usingfactorymethod

标签 c# wcf castle-windsor factory-pattern

我正在尝试看看这是否可行。我想通过工厂类从温莎城堡解析 WCF 服务类。 WCF 服务托管在 IIS 中,到目前为止,当我在使用工厂时尝试调用该服务时,我只收到 404。这是我的注册码:

container.AddFacility<WcfFacility>();

container.Register(Component.For<IServiceFactory>() 
                            .ImplementedBy<ServiceFactory>()
                            .LifestyleSingleton());

container.Register(Component.For<IFooService>()
                            .UsingFactoryMethod((kernel, context)
                                    => kernel.Resolve<IServiceFactory>()
                                                     .CreateService(context.RequestedType))                                     
                            .Named("FooService")
                            .LifestylePerWcfOperation());

这是我的工厂类:

public class ServiceFactory : IServiceFactory
{
    public IFooService CreateService(Type forType)
    {
        IFooService createdType = null;

        if (forType == typeof(IFooService))
            createdType = new FooService();

        return createdType;
    }
}

我试过做一个 strait .ImplementedBy() 并且效果很好。只有当我想通过工厂来做时,我才会遇到问题。这可能吗,意味着我遗漏了什么,还是不可能?

(我知道显示的代码非常简单,我只是在完全实现我的工厂代码之前测试它是否可行)

最佳答案

没有创建自定义 ServiceHost 来执行此操作,尽管您是对的,但这比它应该做的要难。 eouw0o83hf 引用的文章首先讨论了 IInstanceProvider。这是关键,但您也可以使用 WCF ServiceBehavior 而不是客户 ServiceHost 来连接它。我不确定你的 FactoryMethod 与此有什么关系 - 听起来这是一个一般的接线问题......或者我不明白你的问题。我将在下面展示如何在没有 ServiceHost 的情况下进行连接,希望这能解决您的问题。

首先创建一个实现 IInstanceProvider 的类 - 下面我的调用了我的 ObjectResolver 类并包装了 Windsor。为简洁起见,我将省略它。

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;

public class ObjectResolverInstanceProvider : IInstanceProvider
{
    private readonly Type _serviceType;

    public ObjectResolverInstanceProvider(Type serviceType)
    {
        _serviceType = serviceType;
    }

    public object GetInstance(InstanceContext instanceContext)
    {
        return ObjectResolver.Resolve(_serviceType);
    }

    public object GetInstance(InstanceContext instanceContext, Message message)
    {
        return ObjectResolver.Resolve(_serviceType);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {
        ObjectResolver.Release(instance);
    }
}

然后创建一个服务行为,将您的实例提供者分配给每个端点的 DispatchRuntime 的 InstanceProvider:

using System;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;

public class ConstructWithObjectResolverAttribute : Attribute, IServiceBehavior
{
    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
        {
            ChannelDispatcher cd = cdb as ChannelDispatcher;

            if (cd != null)
            {
                foreach (EndpointDispatcher ed in cd.Endpoints)
                {
                    ed.DispatchRuntime.InstanceProvider = new ObjectResolverInstanceProvider(serviceDescription.ServiceType);
                }
            }
        }
    }

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }
}

接下来将服务属性应用于您的服务实现...请注意,如果您也愿意,也可以在配置中执行此操作,但我更喜欢通过这样的属性来应用它:

   [ConstructWithObjectResolver]
   [ServiceBehavior(Namespace="YourNamespace")]
   public class FooService : IFooService {}

关于c# - 使用 CaSTLe windsor 解析 WCF service usingfactorymethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18023142/

相关文章:

c# - 通过定时器C#删除ListView中的项目

jquery - WCF 正在更改从 jQuery .ajax 调用返回的 JSON 格式的日期时间

.net - 消息代理(Kafka、RabbitMQ)VS 服务总线(nServiceBus)

c# - 为什么 Windsor 只能拦截虚拟或接口(interface)方法?

nhibernate - 如何使用 LifestyleScoped 实现 CaSTLe Windsor IScopeAccessor 以提供每个 ViewModel 的 NHibernate session

caSTLe-windsor - 在 CaSTLe 中注册组件后更改 ServiceOverride

c# - 所有值的计数均为零的频率表

javascript - 将 Javascript 转换为 C# 问题

c# - Visual Studio的 "Add Service Reference"是如何反序列化对象的?

c# - c#中的ImmutableArray是什么