评论一个非常糟糕的主意

时间:2010-07-07 09:09:22

标签: .net extension-methods

我有一个非常糟糕的主意:)

在vb中探索扩展方法时,我突然想到如何在字符串上创建一个扩展方法来执行数据访问代码。

<Extension()> Function Execute(ByVal s As String) As Data.DataTable
  'make code here to access the database ..
  'read connectionstring from the .config file 

End Function

然后在你的网站上你可以做这样的事情......

<%For Each dr In "select * from product".Execute.Rows%>
   some HTML output here..
<%Next%>

我知道这不是这样做的方法,但是在非常简单的应用程序中,或者在原型中,它将非常简单明了。

有何评论?

3 个答案:

答案 0 :(得分:3)

我认为你已经回答了自己的问题 - 这不是一个好主意。为方便起见,扩展方法在许多情况下都很有用,但语义不一致/混淆在这里超过了。

您正在做的是创建一个扩展方法,该方法假装是一个作用于所有字符串的函数(方法),但实际上只在数据库的SQL查询的窄上下文中有意义。这种语义范围的不匹配表明扩展方法在这里并不合适,尽管静态辅助方法完全没问题。

答案 1 :(得分:1)

  

我认为你已经回答了自己的问题 - 这不是一个好主意。为方便起见,扩展方法在许多情况下都很有用,但语义不一致/混淆在这里超过了。

我完全同意Noldorin,但我想扩大他的答案。

我们在代码库中使用映射器,它们都使用IMaper&lt; TInput,TOutput&gt;接口。我们也曾经让每个映射器实现一个MapAll方法来映射输入IEnumerable  输出IEnumerable,每个实现是相同的。该提议是为MapAll创建一个扩展方法,但问题是它将成为一个扩展方法的对象:

public IEnumerable<TOutput> MapAll<TInput, TOutput>(
    this IEnumerable<TInput>, IMapper<TInput, TOutput>)

或者

public IEnumerable<TOutput> MapAll<TInput, TOutput>(
    this IMapper<TInput, TOutput>, IEnumerable<TInput>)

虽然他们都会做同样的工作,但第一个工作会让人感到困惑,因为MapAll方法只在某些情况下才有用,但它始终存在于你的知识分子中。作为第二种方法,虽然你可能不需要MapAll方法,但是很清楚方法的目的是什么。

因此,为了使您的提案有效,您可以为IDbCommand接口创建一个扩展方法,它接受一个字符串(请原谅我的尝试VB.Net):

<Extension()> Function Execute(
    ByRef con As IDbConnection, ByVal command as String) As Data.DataTable
    ...
End Function

并像这样使用它:

<%For Each dr In conn.Execute("select * from product").Rows%>
    some HTML output here..
<%Next%>

我认为方法名称不清楚,应该像GetDataTable,但你可以了解我的意思。

如果你想要,你可以在mapper界面和扩展方法here上看到我的博客帖子,为你提供一些关于我的内容的背景信息。

答案 2 :(得分:0)

我看不出它只是将它作为Execute方法将字符串作为参数更简单。这只会令人困惑。