2

我想看看这是否可能。我想通过工厂类从温莎城堡解决 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;
    }
}

我试过做一个海峡 .ImplementedBy<FooService>() 并且效果很好。只有当我想通过工厂进行操作时,我才会遇到问题。这是可能的,意味着我错过了什么,还是不可能?

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

4

1 回答 1

0

您不必创建定义 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 {}
于 2013-08-03T19:58:40.137 回答