【问题标题】:Lots of functions that take the same parameter?许多函数采用相同的参数?
【发布时间】:2012-11-21 08:02:58
【问题描述】:

如果问题有点不清楚,我很抱歉。请随时清理/概括这个问题。我英语不够好,不能自己做

我需要使用网络服务,网络服务的所有方法都将身份验证对象作为第一个参数

class webservice{
    e_webservice_return_value method1(object authentication,object param1,object param2,object param32)
    e_webservice_return_value method2(object authentication,object param1,object param2)
    .....
}

有数百种方法。

我想创建一个提供所有方法的提供者类 现在我可以创建一个名为 provider 的类并为每个方法编写

class provider{
    object _auth;
    e_webservice_return_value method1(object param1,object param2,object param3)
    {
        var res= method1(_auth,param1,param2,param3);
        if(res=bad auth)
        {
            ReAuth(auth);
        }
        return res;
    }

    e_webservice_return_value method2(object param1,object param2)
    {
        var res =return e_webservice_return_value method2(_auth,param1,param2);
        if(res=bad auth)
        {
            ReAuth(auth);
        }
        return res;
    }
}

数百种方法我都需要这种模式。

有没有一种技术可以创建这样一个外观对象,而无需实际编写 100 个具有相同功能的函数? (只有第一个参数相同)其他可能不同

【问题讨论】:

  • 您不应该使用委托并仅在身份验证有效时调用该委托吗?

标签: c# design-patterns facade


【解决方案1】:

您可能想选择Reflection.Emit。可以在this site 找到一个不错但可能有点过时的教程。还可以看看 MSDN - 他们有 great 文档!

您通常想要做的是用一个属性标记每个方法(或整个类),并为每个这样的方法/类用一个属性创建一个包装方法,并替换代码。您可以让它在应用程序初始化或第一次调用此类/方法时运行,设计由您决定。

这不是一件容易的事,但实际上我们的项目中有相同的案例,并且证明是一个很好的解决方案。这是因为每个具有给定属性的方法都需要类似的处理。

请记住,有一些替代方法可以发出代码,但我不太了解它们,所以我无法提供任何建议 - 但它很容易在谷歌上搜索。

Reflection.Emit 单独使用 IL 是很麻烦的,但它确实可以让您更多地了解 C# 代码中发生的事情。

【讨论】:

  • 我理解这个想法,但这可能是可怕的智能感知,不是吗?
  • 哦,是的,这是真的。不仅从智能感知的角度来看,编译也不会知道新方法。我的建议来自这样一个事实,即您正在构建一个 Web 服务。我们的场景是:采用一个方法,即 WCF 端点(带有 restful API),使用 IL 为该方法创建一个包装器,将此包装器视为一个新的端点。这样我们就不会直接调用我们的方法,它们是由框架调用的,因为它们具有适当的 WCF 属性。还有其他可能的情况,有些更难,有些更容易;]
猜你喜欢
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
相关资源
最近更新 更多