我有一个非常糟糕的主意:)
在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%>
我知道这不是这样做的方法,但是在非常简单的应用程序中,或者在原型中,它将非常简单明了。
有何评论?
答案 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
方法将字符串作为参数更简单。这只会令人困惑。