Biblioteca de clases .NET Guard?
-
08-07-2019 - |
Pregunta
Estoy buscando una biblioteca o código fuente que proporcione métodos de protección, como la comprobación de argumentos nulos. Obviamente, esto es bastante simple de construir, pero me pregunto si ya hay alguno para .NET. Una búsqueda básica en Google no reveló mucho.
Solución
Hay CuttingEdge.Conditions . Ejemplo de uso de la página:
public ICollection GetData(Nullable<int> id, string xml, ICollection col)
{
// Check all preconditions:
id.Requires("id")
.IsNotNull() // throws ArgumentNullException on failure
.IsInRange(1, 999) // ArgumentOutOfRangeException on failure
.IsNotEqualTo(128); // throws ArgumentException on failure
xml.Requires("xml")
.StartsWith("<data>") // throws ArgumentException on failure
.EndsWith("</data>"); // throws ArgumentException on failure
col.Requires("col")
.IsNotNull() // throws ArgumentNullException on failure
.IsEmpty(); // throws ArgumentException on failure
// Do some work
// Example: Call a method that should not return null
object result = BuildResults(xml, col);
// Check all postconditions:
result.Ensures("result")
.IsOfType(typeof(ICollection)); // throws PostconditionException on failure
return (ICollection)result;
}
Otro buen enfoque, que no está empaquetado en una biblioteca, pero podría ser fácilmente, en el blog Paint.Net :
public static void Copy<T>(T[] dst, long dstOffset, T[] src, long srcOffset, long length)
{
Validate.Begin()
.IsNotNull(dst, "dst")
.IsNotNull(src, "src")
.Check()
.IsPositive(length)
.IsIndexInRange(dst, dstOffset, "dstOffset")
.IsIndexInRange(dst, dstOffset + length, "dstOffset + length")
.IsIndexInRange(src, srcOffset, "srcOffset")
.IsIndexInRange(src, srcOffset + length, "srcOffset + length")
.Check();
for (int di = dstOffset; di < dstOffset + length; ++di)
dst[di] = src[di - dstOffset + srcOffset];
}
Lo uso en mi proyecto y puede tomar prestado el código desde allí.
Otros consejos
Dado los Contratos de código de Microsoft que salen con .NET 4.0, trataría de encontrar uno que sea principalmente compatible, si es posible, y si no, escríbalo usted mismo. De esa manera, cuando actualice a .NET 4.0 (eventualmente) la migración será más fácil.
Hay varios métodos que puede usar.
Mi favorito es usar la Programación Orientada a Aspectos. Echa un vistazo a PostSharp.
También puede echar un vistazo a Spec #, una extensión de C #
En 4.0, tendrá una biblioteca de contrato con todas las funciones.
Finalmente, un colega mío ha creado una biblioteca de guardia bastante útil: http://blueonionsoftware.com/blog.aspx?p= ca49cb62-7ea2-43c5-96aa-91d11774fb48
No conozco ninguno que esté disponible comercialmente. Existe cierto soporte para este tipo de código en los patrones & amp; practica Enterprise Library. También hay muchos proyectos de código abierto que parecen hacer esto también (en diversos grados) en CodePlex: http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=validation .
La mayoría de las veces, estos tipos de bibliotecas terminan siendo escritos a medida y permanecen internos a la empresa que los usa.
Hay compatibilidad con .NET 4.0 para proporcionar mecanismos para hacer esto usando Contratos de código , que se basan en la especificación #.
Recientemente escribí una publicación sobre clases de guardia (sin haber encontrado ninguna información tampoco): http://ajdotnet.wordpress.com/2009/08/01/posting-guards-guard-classes-explained/
También publiqué una implementación de clase de Guardia respectiva (siéntase libre de usar este código tal como está o de ajustarlo a sus necesidades): ajdotnet.wordpress.com/guard-class/
Con respecto a la relación entre las clases de Guardia y el Contrato de Código en .NET 4.0 (sucesor de la Especificación #), eche un vistazo a la siguiente publicación: www.leading-edge-dev.de/?p=438
(perdón por los enlaces fragmentados, el sitio solo permitió un enlace ...)
HIH, AJ.NET
Instale el paquete nuget netfx-guard. También obtienes fragmentos de código nulos y con poca nota, y funciona tan rápido como tus comprobaciones manuales