gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:35 26 4
gpt4 key购买 nike

我正在尝试看看这是否可行。我想通过工厂类从温莎城堡解析 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com