.net 对一个非常糟糕的主意的评论
我有一个非常糟糕的主意:) 在vb中探索扩展方法时,我突然想到了在字符串上创建一个扩展方法来执行数据访问代码.net 对一个非常糟糕的主意的评论,.net,extension-methods,.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 函数执行(ByVal s作为
<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
函数执行(ByVal s作为字符串)作为Data.DataTable
'在此处生成代码以访问数据库。。
'从.config文件中读取connectionstring
端函数
然后在你的网站上你可以做这样的事情
<%For Each dr In "select * from product".Execute.Rows%>
some HTML output here..
<%Next%>
这里有一些HTML输出。。
我知道这不是解决问题的方法,但在非常简单的应用程序中,或者在原型中,这将非常简单和直接
有什么评论吗 我看不出它会比把它作为一个
Execute
方法来使用字符串作为参数更简单。这会让人感到困惑。我看不出它比将字符串作为参数的Execute
方法更简单。这会让人困惑。我想你已经回答了你自己的问题——这不是一个好主意。为了方便起见,扩展方法在很多情况下都很有用,但语义不一致/混淆在这里更为重要
您所做的是创建一个扩展方法,它假装是一个作用于所有字符串的函数(方法),但实际上仅在数据库上的SQL查询的狭窄上下文中才有意义。这种语义范围的不匹配表明扩展方法在这里并不合适,尽管静态助手方法也很好。我认为您已经回答了自己的问题-这不是一个好主意。为了方便起见,扩展方法在很多情况下都很有用,但语义不一致/混淆在这里更为重要 您所做的是创建一个扩展方法,它假装是一个作用于所有字符串的函数(方法),但实际上仅在数据库上的SQL查询的狭窄上下文中才有意义。这种语义范围的不匹配表明扩展方法在这里并不合适,尽管静态辅助方法也很好
我想你已经回答了你自己的问题——这不是一个好主意。为了方便起见,扩展方法在很多情况下都很有用,但语义不一致/混淆在这里更为重要 我完全同意诺尔多林的观点,但我想进一步阐述他的答案 我们在代码库中使用映射器,它们都使用IMaper接口。我们还曾经让每个映射器实现映射输入IEnumerable的MapAll方法 对于输出IEnumerable,每个实现都是相同的。该提案旨在为MapAll创建一个扩展方法,但问题是它将成为什么对象的扩展方法:
public IEnumerable<TOutput> MapAll<TInput, TOutput>(
this IEnumerable<TInput>, IMapper<TInput, TOutput>)
public IEnumerable MapAll(
这是我的数字,伊玛珀)
或
public IEnumerable MapAll(
这是一张图片,我无法计数)
虽然它们都会做同样的工作,但第一种方法确实令人困惑,因为MapAll方法仅在某些情况下相关,但它始终存在于您的智能感知中。其中,作为第二种方法,您可能不需要始终使用MapAll方法,但很清楚该方法的目的是什么
因此,为了使您的建议生效,您可以为IDbCommand接口创建一个扩展方法,该方法将接收字符串(请原谅我尝试使用VB.Net):
函数执行(
ByRef con作为IDbConnection,ByVal命令作为字符串)作为Data.DataTable
...
端函数
并像这样使用它:
<%For Each dr In conn.Execute("select * from product").Rows%>
some HTML output here..
<%Next%>
这里有一些HTML输出。。
我认为方法名称不清楚,应该类似于GetDataTable,但您可以理解我的意思
如果你愿意,你可以在mapper界面和扩展方法上看到我的博客文章,为你提供一些关于我的内容的上下文
我想你已经回答了你自己的问题——这不是一个好主意。为了方便起见,扩展方法在很多情况下都很有用,但语义不一致/混淆在这里更为重要 我完全同意诺尔多林的观点,但我想进一步阐述他的答案 我们在代码库中使用映射器,它们都使用IMaper接口。我们还曾经让每个映射器实现映射输入IEnumerable的MapAll方法 对于输出IEnumerable,每个实现都是相同的。该提案旨在为MapAll创建一个扩展方法,但问题是它将成为什么对象的扩展方法:
public IEnumerable<TOutput> MapAll<TInput, TOutput>(
this IEnumerable<TInput>, IMapper<TInput, TOutput>)
public IEnumerable MapAll(
这是我的数字,伊玛珀)
或
public IEnumerable MapAll(
这是一张图片,我无法计数)
虽然它们都会做同样的工作,但第一种方法确实令人困惑,因为MapAll方法仅在某些情况下相关,但它始终存在于您的智能感知中。其中,作为第二种方法,您可能不需要始终使用MapAll方法,但很清楚该方法的目的是什么
因此,为了使您的建议生效,您可以为IDbCommand接口创建一个扩展方法,该方法将接收字符串(请原谅我尝试使用VB.Net):
函数执行(
ByRef con作为IDbConnection,ByVal命令作为字符串)作为Data.DataTable
...
端函数
并像这样使用它:
<%For Each dr In conn.Execute("select * from product").Rows%>
some HTML output here..
<%Next%>
这里有一些HTML输出。。
我认为方法名称不清楚,应该类似于GetDataTable,但您可以理解我的意思
如果你愿意,你可以在mapper界面和扩展方法上看到我的博客文章,让你了解我的内容。这个问题是否只是为了让你确认这个想法真的和看起来一样糟糕?请注意,可以像Tools.GetRows(“select..”)一样调用的静态函数也可以解决您的问题。这个问题是否只是为了让您确认这个想法确实和它看起来一样糟糕?请注意,可以调用的静态函数