Este es un tema muy antiguo, pero que ha saltado a mi vista en esta etapa tardía y me gustaría algunos comentarios mientras trato de defender las propiedades de solo escritura ...
Tengo un conjunto de ActiveReport
clases que forman parte de un sitio web que se instancian y se ejecutan en la devolución de datos después de varias selecciones de usuarios.
El código VB se parece a esto:
Public Class SomeReport
Private greader As New GenericReporting.CommonReader("AStoredProcedure",
{New SqlParameter("budget_id", 0)})
Public WriteOnly Property BudgetID As Integer
Set(value As Integer)
greader.Parameters("budget_id").Value = value
End Set
End Property
Public Sub New(Optional budget_id As Integer = 0)
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
BudgetID = budget_id
End Sub
End Class
Estos informes usan agallas genéricas, CommonReader
toman un procedimiento almacenado y una matriz de SqlParameter
correos predeterminados , cada uno de los cuales tiene una propiedad WriteOnly asociada que, según el diseño del informe, podría pasar como un parámetro en la creación de instancias o establecido por el usuario después de la creación de instancias antes llamando al Run
método de informes .
'''''''''''''''''''''''
' Parameter taken from a user selected row of a GridView
'
Dim SomeBudgetID As Integer = gvBudgets.SelectedDataKey.Values(budget_id)
'''''''''''''''''''''''
' On Instantiation
'
Dim R as ActiveReport = New SomeReport(SomeBudgetID)
R.Run()
'''''''''''''''''''''''
' Or On Instantiation using "With" syntax
'
Dim R as ActiveReport = New SomeReport() With {.BudgetID = SomeBudgetID}
R.Run()
'''''''''''''''''''''''
' Or After
'
Dim R as ActiveReport = New SomeReport()
R.BudgetID = SomeBudgetID
R.Run()
Entonces, como lo veo, tener propiedad de solo escritura en este caso
- Permite una verificación de tipo más fuerte ya que los
SqlParameter
s son genéricos
- Más flexibilidad para crear el informe, el informe se puede instanciar de inmediato si todos los parámetros están disponibles o se agregan después a medida que estén disponibles.
- Las propiedades admiten la sintaxis "Con" en la instanciación
- ¿Es realmente necesario un "captador" ya que el Informe conoce los parámetros y el Informe no los altera?
- Dado que los
SqlParameter
s son clases y no valores primitivos, las propiedades WriteOnly permiten una interfaz más simple para configurar parámetros
Así que esos son mis pensamientos.
¿Podría convertirlo a un método en su lugar? seguro, pero la interfaz parece ... menos agradable
R2.BudgetID = SomeBudgetID
versus
R2.SetBudgetID(SomeBudgetID)