ich würde eher die Art, die Sie für einen bestimmten Wert in einer Konfigurationsdatei instanziiert werden sollen. Etwas wie:
<TypeMappings>
< TypeMapping name = "Leben" type = "Entities.LifeEntity, Entities"/>
< TypeMapping name = "Eigenschaft" type = "Entities.PropertyEntity, Entities"/>
< TypeMapping name = "Behinderung" type = "Entities.DisabilityEntity, Entities"/>
< TypeMapping name = "Kreditkarte" type = "Entities.CreditCardEntity, Entities"/>
TypeMappings</>
In Ihrer Methode, die Sie dann alle Anmeldungen aus der Config-Datei extrahieren können, finden Sie das passende ein und Reflektion verwenden den Typ instanziiert, wenn die Registrierung nicht gefunden wird, werfen Sie eine Ausnahme.Hier
ist ein Beispielcode:
namespace Entities
{
public interface IResultEntity
{
}
public class LifeEntity : IResultEntity
{
public override string ToString()
{
return("I'm a Life entity");
}
}
public class PropertyEntity : IResultEntity
{
public override string ToString()
{
return("I'm a Property Entity");
}
}
public class CreditCardEntity : IResultEntity
{
public override string ToString()
{
return("I'm a CreditCard Entity ");
}
}
public class DisabilityEntity : IResultEntity
{
public override string ToString()
{
return("I'm a Disability Entity");
}
}
}
public static Entities.IResultEntity GetEntity(string entityTypeName,string fileName)
{
XDocument doc = XDocument.Load(fileName);
XElement element = doc.Element("TypeMappings").Elements("TypeMapping")
.SingleOrDefault(x => x.Attribute("name").Value == entityTypeName);
if(element == null)
{
throw new InvalidOperationException("No type mapping found for " + entityTypeName);
}
string typeName = element.Attribute("type").Value;
Type type = Type.GetType(typeName);
Entities.IResultEntity resultEntity = Activator.CreateInstance(type) as Entities.IResultEntity;
if(resultEntity == null)
{
throw new InvalidOperationException("type mapping for " + entityTypeName + " is invalid");
}
return resultEntity;
}
public static void Main()
{
try
{
Entities.IResultEntity result = GetEntity("life", @"c:\temp\entities.xml");
Console.WriteLine(result);
result = GetEntity("property", @"c:\temp\entities.xml");
Console.WriteLine(result);
result = GetEntity("disability", @"c:\temp\entities.xml");
Console.WriteLine(result);
result = GetEntity("creditcard", @"c:\temp\entities.xml");
Console.WriteLine(result);
result = GetEntity("foo", @"c:\temp\entities.xml");
Console.WriteLine(result);
}
}
Viele DI-Frameworks können Sie mehrere Registrierungen für eine Schnittstelle zur Verfügung stellen, die Sie auf Metadaten Abfrage basiert können. Schauen Sie sich this link an, wie MEF exportiert mit Metadaten.
So nähere ich mich normalerweise einer Factory, insbesondere in Bibliotheken, in denen Client-Apps möglicherweise eigene Implementierungen hinzufügen möchten. – Joon
Diese Quelle für weitere Informationen Link ist nicht mehr verfügbar, jede Chance, dass es woanders gehostet wird? Oder gibt es irgendwo einen gleichwertigen Beitrag? –
@Sam Heuck Ich verlinkte eine archivierte Version – Lennart