gpt4 book ai didi

wcf - CaSTLe WCF 设施,对非通用合约使用通用接口(interface)

转载 作者:行者123 更新时间:2023-12-02 14:31:07 25 4
gpt4 key购买 nike

我尝试使用泛型和城堡 WCF 设施来尽量减少大型项目的 WCF CRUD 部分的代码编写。

我有 WCF 服务契约(Contract):

[ServiceContract]
public interface IResourceService : ICRUDService<DTOResource>
{
[OperationContract]
DTOResource Get(long id);
}

通用接口(interface)

public interface ICRUDService<T> where T is IDTO
{
T Get(long id);
}

也是通用 MVC Controller (1 个 Controller 用于 dtos 和服务的所有基本 CRUD)

public class CRUDController<T> : Controller where T is IDTO
{
readonly ICRUDService<T> service;
public CRUDController(ICRUDService<T> service)
{
this.service = service;
}
}

在客户端,我在 Windsor 容器中注册 WCF 客户端

Component
.For<IResourceService , ICRUDService<DTOResource>>()
.AsWcfClient(... standard stuff... )

一切都工作正常,组件和服务注册, Controller 创建正确,服务

readonly ICRUDService<T> service;

Controller 的类型为

Castle.Proxies.IResourceService 

但是当我尝试在 Controller 中使用服务时出现错误

Method Get is not supported on this proxy, this can happen if the method is
not marked with OperationContractAttribute or if the interface type is not
marked with ServiceContractAttribute.

当在 Controller 中时,我硬编码强制转换

((IResourceService)service).Get(id);

一切运行正常,所以我相信这个问题是可以解决的。

我也尝试过使用 Forward(结果相同):

Component
.For<IActionTypeService>
.Forward<ICRUDService<DTOResource>>().AsWcfClient(...

如何让它发挥作用?

最佳答案

最后我不得不在客户端使用“ channel 工厂”。我能够在服务器端使用 Windsor WCF Facility 来注册通用合约:

[ServiceContract]
public interface ICRUDService<I>
{
[OperationContract]
I Get(int id);
}

具有通用实现

public class CRUDService<I, IEntity> : ServiceBase, ICRUDService<I>
{
public I Get(int id)
{
...
}

以标准方式(针对多种类型)

private void InstallExample<I, IEntity>(IWindsorContainer container)
{
container.Register(
Component
.For<ICRUDService<I>>()
.ImplementedBy(CRUDService<I, IEntity>)
.Named("somename")
.AsWcfService(
new DefaultServiceModel()
.Hosted()
.PublishMetadata(x => x.EnableHttpGet())
.AddEndpoints(WcfEndpoint
.BoundTo(new BasicHttpBinding())
.At("someAddress")
)
)
.LifeStyle.PerWcfOperation();
}

web.config中进行无文件激活

<add factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory, Castle.Facilities.WcfIntegration" service="ClientService" relativeAddress="./ClientService.svc" />

在服务器端它工作得很好。遗憾的是,在客户端,我没有找到 WCFFacility 的工作解决方案,我不得不使用 ChannelFactory (运行完美)

ChannelFactory<ICRUDService<I>> factory = new ChannelFactory<ICRUDService<I>>(someBinding, someEndpoint);

对于其余部分(标准非通用服务,我正在使用 WCF 设施,没有任何问题。

关于wcf - CaSTLe WCF 设施,对非通用合约使用通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13474288/

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