2011-01-24 17 views
7

En una de las aplicaciones en las que estoy trabajando, hay dos funcionalidades básicas incluidas: Crear y Actualizar.Implementar métodos parciales en varios ensambles

Sin embargo, hay una necesidad a veces para agregar código personalizado, así que pensé de extender el código, permitiendo 3 partes para escribir e incrustar su propio código:

OnCreating OnCreated OnUpdating OnUpdated

¿Hay alguna manera de habilitar lo anterior en varios ensambles? MEF podría ayudar aquí?

Gracias Saludos


Gracias a todos por sus respuestas.

Tener una interfaz de este tipo significa que cada ensamblaje externo tiene que implementar esa interfaz según sea necesario. Entonces, el código de mi aplicación, necesita recorrer los ensamblajes actualmente en ejecución, detectar todas las clases que implementan esa interfaz y ejecutar sus métodos.

¿Se ajusta MEF aquí? ¿Puedo exportar la implementación desde ensamblajes externos e importarlos dentro de mi aplicación?

Gracias Saludos

Respuesta

2

cuanto a su pregunta MEF, que probablemente podría hacer algo como lo siguiente para ejecutar los métodos de una interfaz:

var catalog = new DirectoryCatalog("bin"); 
var container = new CompositionContainer(catalog); 
container.ComposeParts(); 

var plugins = container.GetExportedValues<IPlugin>(); 
foreach (IPlugin plugin in plugins) 
{ 
    plugin.OnCreating(); 
} 

O crear una interfaz con eventos como sugirió Brian red:

public interface IPlugin 
{ 
    event OnCreatingEventHandler OnCreating; 
} 

entonces el código anterior sería más como:

var catalog = new DirectoryCatalog("bin"); 
var container = new CompositionContainer(catalog); 
container.ComposeParts(); 

var plugins = container.GetExportedValues<IPlugin>(); 
foreach (IPlugin plugin in plugins) 
{ 
    plugin.OnCreating += MyOnCreatingHandler; 
} 

Creo que me gusta th e posterior para los nombres de método que especificó. Por mi trabajo plugin, he creado una interfaz similar a la siguiente:.

public interface IPlugin 
{ 
    void Setup(); 
    void RegisterEntities(); 
    void SeedFactoryData(); 
} 

El método RegisterEntities() extiende el esquema de base de datos en tiempo de ejecución, y el método SeedFactoryData() añade los datos por defecto (por ejemplo, la adición de usuario por defecto, pre- tabla de población de Ciudades, etc.).

14

No se puede tener clases partical cruzando asambleas porque las clases parciales son una característica del lenguaje, y no una función CLR. El compilador de C# fusiona todas las clases parciales en una sola clase real, y esa única clase es lo único que queda después de la compilación.

usted tiene un par de alternativas:

  1. eventos ofrecen
  2. Hacer los métodos virtual y anularlos
  3. uso de una interfaz

Su problema parece que se ajuste a los eventos mejor. El usuario simplemente puede suscribirse a ellos en el otro ensamblaje.

1

No se admite el uso de clases parciales en ensamblajes.

La razón es que todas las definiciones de clases parciales se combinan en una sola clase durante el tiempo de compilación. Esa única clase reside en un solo conjunto.

0

Los métodos parciales y las clases deben estar en el mismo conjunto. Los métodos parciales se compilan si no se usan. Si necesita puntos de extensión para sus clases, debe buscar métodos o eventos virtuales.

1

Considere el uso de una interfaz:

IUpdatableObject<X> 
    Creating(X obj); 
    Created(X obj); 
    Updating(X obj); 
    Updated(X obj); 

Y luego utilizar esta interfaz para añadir en el código personalizado; cada tercero puede implementar esta interfaz (bien ellos o usted a través de un contenedor) y esto puede ser un empate en la adición de lógica de negocios personalizada.

HTH.

+0

muestra completa con el código fuente completo al respecto? – Kiquenet

1

Usted (o el usuario) puede utilizar los métodos de extensión: http://msdn.microsoft.com/en-us/library/bb383977.aspx

+0

¿Puede profundizar sobre cómo los métodos de extensión son útiles aquí? No creo que ayuden con el tipo de puntos de extensión que necesita el OP. – CodesInChaos

+1

Estás en lo correcto. Esta respuesta es solo una alternativa a los parciales a través de asambleas. El evento es la mejor manera para el problema original. – r03

0

clases parciales a través de asambleas no son compatibles debido a que el concepto detrás de la clase parcial es permitir que varios desarrolladores aportan diferentes métodos y miembros de la misma clase debajo de un espacio de nombres particular.
Esto se hizo para ayudar a los desarrolladores a sincronizar el código en una sola clase, dentro de un ensamblaje, construir después de la compilación.

Cuestiones relacionadas