2010-07-20 12 views
13

¿Hay algún ejemplo/instancia específico de DI aplicado como principio arquitectónico o patrón de diseño en .NET Framework en sí mismo? ¿Alguno (o muchos) de los tipos en el marco/BCL se ajustan a IoC?Inversión de inyección de control y dependencia en .NET Framework

¡Los nombres de tipos y una breve ilustración/explicación basada en C# serían geniales!

Esto compondría la necesidad de un principio de diseño infundido con DI como una mejor práctica ... ya que se extrajo del marco base mismo.

reitero, yo no busco a IOC/Marcos DI PERO COI/DI EN el marco.

EDITAR: Solo quería obtener más instancias/ejemplos ... de ahí la recompensa!

Respuesta

16

En general no hay una gran cantidad de ejemplos de DI en el BCL - tal vez porque el BCL es un marco bastante autónomo, y DI es más una preocupación de arquitectura de aplicaciones ... Sin embargo, aquí hay algunos ejemplos que he podido encontrar hasta ahora.

Constructor inyección

No hay muchos ejemplos de Constructor de inyección en el BCL. Los mejores candidatos son

  • System.IO.StreamWriter
  • System.IO.StreamReader

inyección Propiedad

  • System.ComponentModel.IComponent.Site

Nosotros también vea una variación en WorkflowRuntime.AddService de Workflow Foundation y métodos relacionados, aunque podría argumentar que esto está más cerca de Inyección de método.

Método de Inyección de

  • System.ComponentModel.Design.IDesigner.Initialize
  • System.ComponentModel.TypeConverter (muchos métodos toman ITypeDescriptorContext)
  • System.Web.Mvc.IModelBinder.BindModel (de ASP.NET MVC)

Ambient Contexto

  • System.Threading.Thread.CurrentPrincipal
  • System.Threading.Thread.CurrentCulture
  • System.Threading.Thread.CurrentUICulture
  • System.Diagnostics.Trace.Listeners

Fwiw , Dibujé estos ejemplos de my upcoming book.

+4

supongo que no puedo competir con alguien que escribió un libro sobre el tema .. .Estoy contento de haber encontrado uno de los ejemplos de la lista. Jaja. –

+1

@Mark Seemann: Estoy en los primeros 5 capítulos (partes 1 y 2) de su libro. En mi opinión, este libro debe * requerirse * leer no solo para desarrolladores de .Net, sino para cualquier programador orientado a objetos. Cosas realmente geniales! Me ha abierto los ojos a tantos errores que he cometido en particular y realmente me ha abierto la mente sobre mejores formas de programar. Sigan con el buen trabajo! –

12

Tanto StreamReader como StreamWriter podrían verse como ejemplos de IoC/DI.

Cada uno le permite inyectar un objeto Stream diferente (o uno de sus derivados) para lectura/escritura, respectivamente.

FileInfo fi = new FileInfo(@"C:\MyFile.dat"); 
StreamWriter sw = new StreamWriter(fi.Open()); 

O:

MemoryStream ms = new MemoryStream(); 
StreamWriter sw = new StreamWriter(ms); 

¿Sería tanto permitir:

sw.Write("Hello world!"); 

De la misma manera, no importa qué tipo de corriente se inyecta en la llamada al constructor.

2

Actualmente estoy leyendo el libro The Art of Unit Testing de Roy Osherove. Menciona una técnica llamada Extraer y sobrecargar (es decir, inyectar una dependencia en una clase anulando un método virtual que es responsable de devolver la dependencia).

creo que me he encontrado con varias instancias de esa técnica, por ejemplo los siguientes:

  • Personalización del tipo ADO.NET DataTable:
    Si que se derivan de DataTable, que tienen la posibilidad de anular varios métodos, como GetRowType(), CreateInstance() y otros.

  • diseñadores de actividad de la Fundación Personalización del flujo de trabajo (en .NET 3.5)
    No recuerdo la clase exacta, pero creo que si se desea crear diseños personalizados de actividad, que se derivan nuevas clases a partir de los ya existentes, y el patrón es muy parecido; anula un método virtual que le permite devolver su dependencia personalizada al marco.

5

Sure - the IServiceProvider interfaz ha sido parte de Framework desde la 1.0. Esto no es DI porque generalmente se trata aquí (usando un "kernel"), pero es IoC usando el patrón de Localizador de Servicio.

Si se mira en cualquier parte del código Diseñador de Windows Forms, usted lo verá salpicada generosamente con líneas como ésta:

IDesignerOptionService service = 
    (IDesignerOptionService)this.GetService(typeof(IDesignerOptionService)); 

Si está trabajando con un Component, a continuación, tendrá acceso a esto a través de la propiedad Site. Es bastante común y requiere conocimiento práctico al crear controles personalizados.

Esta es la ubicación del servicio, ejemplo de libro de texto. Tiene un IServiceProvider genérico que entrega los servicios abstractos que solicita por tipo de servicio. Si alguna vez desea crear diseñadores personalizados, etiquetas inteligentes, etc., debe saber todo esto. Es similar para ASP.NET también.


P.S. Por favor, no useIServiceProvider en el nuevo código. Es una interfaz muy antigua, no genérica. Si está creando bibliotecas reutilizables que requieren un contenedor IoC para poder funcionar, debe usar el Common Service Locator. Pero ni siquiera use que a menos que exija absolutamente que su biblioteca sea independiente de la biblioteca DI utilizada en el nivel de la aplicación; la mayoría de los contenedores/kernels específicos de la implementación ofrecen API mucho más ricas que perderás si te clavas al CSL.

4

Este es un ejemplo de cómo se puede crear un System.ComponentModel.Composition.Hosting.CompositionContainer en .NET 4:

var exeCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
var dircatalog = new DirectoryCatalog("."); 
var aggregateCatalog = new AggregateCatalog(exeCatalog, dirCatalog); 
var exportProvider = new CatalogExportProvider(aggregateCatalog); 
var container = new CompositionContainer(exportProvider); 

Este es un ejemplo de la inyección de dependencia a través de argumentos de constructor. Debido a que se siguió el patrón de inyección de dependencia, estas clases son muy extensibles: puede escribir su propia implementación ComposablePartCatalog y pasarla al constructor del proveedor de exportación. O puede omitir todo el concepto de catálogos de piezas y escribir su propia implementación ExportProvider.

(Por cierto, CompostionContainer es en sí mismo parte de un marco COI, pero ese no es el punto de este ejemplo.)

3

.NET, especialmente en un contexto web, ofrece a los proveedores la posibilidad de definir implementaciones alternativas de los componentes del framework. El marco define una clase base abstracta, define una o dos implementaciones concretas en la parte superior y permite a los usuarios proporcionar sus propias implementaciones cuando lo deseen.

Una vez definido, el usuario no controla el ciclo de vida de su implementación. El marco toma el control y administra la creación de instancias, la configuración y la eliminación.

Comience con System.Configuration.Provider.ProviderBase.

.NET clases que implementan ProviderBase:

  • System.Configuration.ProtectedConfigurationProvider - cifrar y descifrar los datos de configuración protegida
    • System.Configuration.DpapiProtectedConfigurationProvider (hormigón)
    • System.Configuration.RsaProtectedConfigurationProvider (hormigón)
  • configuraciones personalizadas en la arquitectura de configuración de la aplicación
    • System.Configuration.LocalFileSettingsProvider (hormigón)
    • System.Web.Profile.ProfileProvider
      • System.Web.Profile.SqlProfileProvider (hormigón)
      -
  • System.Web.Management.WebEventProvider - personalizar el procesamiento de eventos de salud ASP.NET
    • System.Web.Management.BufferedWebEventProvider
      • System.Web.Management.MailWebEventProvider
        • System.Web.Management.SimpleMailWebEventProvider (hormigón)
        • System.Web.Management.TemplatedMailWebEventProvider (hormigón)
      • System.Web.Management.SqlWebEventProvider (hormigón)
    • System.Web.Management.EventLogWebEventProvider (concreto)
    • System.Web.Management.IisTraceWebEventProvider (concreto)
    • System.Web.Management.TraceWebEventProvider (hormigón)
    • System.Web.Management.WmiWebEventProvider (hormigón)
  • System.Web.Security.MembershipProvider - suscripciones personalizado para servicios de suscripción
    • System.Web.Security.ActiveDirectoryMembershipProvider (hormigón)
    • System.Web.Security.SqlMembershipProvider (hormigón)
  • System.Web.Security.RoleProvider - función de gestión personalizada para los servicios de gestión de papel
    • System.Web.Security.AuthorizationStoreRoleProvider (hormigón)
    • System.Web.Security.SqlRoleProvider (hormigón)
    • System.Web.Security.WindowsTokenRoleProvider (hormigón)
  • System.Web.SessionState.SessionStateStoreProviderBase - almacenes de datos de estado de sesión
    • System.Web.SessionState.InProcSessionSt ateStore (hormigón)
    • System.Web.SessionState.OutOfProcSessionStateStore (hormigón)
    • System.Web.SessionState.SqlSessionStateStore (hormigón)
  • System.Web.SiteMapProvider - Mapa del sitio personalizada almacén de datos persistente
    • sistema. Web.StaticSiteMapProvider
      • System.Web.XmlSiteMapProvider (hormigón)
  • System.Web.UI.WebControls.WebParts.PersonalizationProvider - cargas y almacenamientos de datos de personalización en nombre de una instancia de WebPartPersonalization
    • System.Web.UI.WebControls.WebParts.SqlPersonalizationProvider (hormigón)

Ejemplos:

Cuestiones relacionadas