Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 对一个非常糟糕的主意的评论_.net_Extension Methods - Fatal编程技术网

.net 对一个非常糟糕的主意的评论

.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作为

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

在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作为字符串)作为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..”)一样调用的静态函数也可以解决您的问题。这个问题是否只是为了让您确认这个想法确实和它看起来一样糟糕?请注意,可以调用的静态函数