Комментарии к очень плохой идее - PullRequest
0 голосов
/ 07 июля 2010

У меня действительно плохая идея:)

При изучении методов расширения в 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 ]

3 голосов
/ 07 июля 2010

Я думаю, что вы ответили на свой вопрос - это не очень хорошая идея. Методы расширения полезны во многих случаях ради удобства, но семантическая несогласованность / путаница перевешивает это здесь.

То, что вы делаете, - это создание метода расширения, который претендует на роль функции (метода), которая действует на все строки, но на самом деле имеет смысл только в узком контексте запросов SQL в вашей базе данных. Такое несоответствие семантической области предполагает, что метод расширения здесь не подходит, хотя статический вспомогательный метод был бы совершенно нормальным.

1 голос
/ 07 июля 2010

Я думаю, что вы ответили на свой вопрос - это не очень хорошая идея. Методы расширения полезны во многих случаях ради удобства, но семантическая несогласованность / путаница перевешивает это.

Я полностью согласен с Нолдорином, но я хотел бы расширить его ответ.

Мы используем мапперы в нашей кодовой базе, и все они используют интерфейс IMaper . Мы также использовали, чтобы каждый из наших картографов реализовывал метод 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 здесь , чтобы дать вам некоторый контекст относительно того, о чем я говорил.

0 голосов
/ 07 июля 2010

Я не вижу, чтобы это было бы проще, чем просто использовать его как Execute метод, который принимает строку в качестве параметра.Это просто сбивает с толку.

...