gpt4 book ai didi

c# - 解决调用链反模式

转载 作者:太空狗 更新时间:2023-10-30 01:26:14 24 4
gpt4 key购买 nike

我开始注意到我的 ASP.NET 开发中存在一些反模式。这让我很困扰,因为保持良好的设计感觉是正确的事情,但同时它闻起来不对。

问题是这样的:我们有一个多层应用程序,底层是一个处理调用为我们提供数据的服务的类。在其之上是一层可能转换、操作和检查数据的类。上面是 ASP.NET 页面。

在许多情况下,服务层的方法在进入 View 之前不需要任何更改,因此模型只是直接传递,例如:

public List<IData> GetData(int id, string filter, bool check)
{
return DataService.GetData(id, filter, check);
}

这并没有错,也不一定很糟糕,但它会产生一种奇怪的复制/粘贴依赖性。我也在做底层服务,它也复制了很多这种模式,并且贯穿始终的接口(interface)。所以发生的事情是,“我需要将 int someotherID 添加到 GetData”,因此我将其添加到模型、服务调用方、服务本身和接口(interface)中。 GetData 实际上代表了几种方法,它们都使用相同的签名但返回不同的信息,这无济于事。这些界面对这种重复有所帮助,但它仍然会时不时地出现。

这个反模式有名字吗?是否有修复,或者对架构进行重大更改是唯一真正的方法?听起来我需要扁平化我的对象模型,但有时数据层会进行转换,因此它具有值(value)。我还喜欢将我的代码区分为“调用外部服务”和“提供页面数据”。

最佳答案

我建议您使用 query object pattern解决这个问题。基本上,您的服务可以具有如下签名:

IEnumerable<IData> GetData(IQuery<IData> query);

在 IQuery 接口(interface)内,您可以有一个方法将工作单元作为输入,例如事务上下文或类似 ISession 的东西,如果您使用的是 NHibernate 之类的 ORM 并返回 IData 对象列表。

public interface IQuery<T> 
{
IEnumerable<T> DoQuery(IUnitOfWork unitOfWork);
}

这样,您就可以创建符合您要求的强类型查询对象,并为您的服务提供一个干净的界面。 This article来自 Ayende 的文章很好地阅读了这个主题。

关于c# - 解决调用链反模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5394328/

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