2012-03-27 57 views
3

我想知道如何更好地這樣寫代碼,使其利用更堅實的原則......改進通用類型檢查(factory-ish模式)以更加符合SOLID?

public static T TransformXmlToEntity<T>(string xml) { 
    if(typeof(T) == typeof(EntityA)) { 
     return TransformXmlToEntityA(xml); 
    } else if (typeof(T) == typeof(EntityB)) { 
     return TransformXmlToEntityB(xml); 
    } 
} 

private static T TransformXmlToEntityA(string xml) { 
    var entityA = new EntityA(); 
    //mapping occurs; sudo code 
    entityA.Person = xml.element(Person).value; 
    ... 
    return entityA; 
} 
private static T TransformXmlToEntityB(string xml) { 
    var entityB = new EntityB(); 
    //mapping occurs; sudo code 
    entityB.Product = xml.element(Product).value; 
    ... 

    return entityB; 
} 

此代碼只是覺得不妥。但我想不出如何做得更好。

回答

2

轉換貼圖怎麼樣?

private static Dictionary<Type, Func<string,object>> conversionMap = new Dictionary<Type, Func<string,object>> 
{ 
    {typeof(EntityA), TransformXmlToEntityA}, 
    {typeof(EntityB), TransformXmlToEntityB}, 
    // .... 
} 

public static T TransformXmlToEntity<T>(string xml) 
{ 
    return (T)conversionMap[typeof(T)](xml); 
} 
+0

+1,很好的解決方案 – sll 2012-03-27 19:52:42

0

我會做這樣的事情

interface IXmlTransformer 
{ 
    string Transform(object entity); 
} 

class EntityAXmlTransformer : IXmlTransformer 
{ 
    string Transform(object entity) { /* implementation */ } 
} 

class EntityBXmlTransformer : IXmlTransformer 
{ 
    string Transform(object entity) { /* implementation */ } 
} 

// ideally an IoC container would do this - but here is a naive factory implementation 
class XmlTransformerFactory 
{ 
    private static readonly Dictionary<Type, IXmlTransformer> transformers = new Dictionary<Type, IXmlTransformer> 
    { 
      { typeof(EntityA), new EntityAXmlTransformer() }, 
      { typeof(EntityB), new EntityBXmlTransformer() } 
    } 

    public IXmlTransformer Get<T>() // could be static 
    { 
     IXmlTransformer transformer; 

     if (!transformers.TryGetValue(typeof(T), out transformer)) 
     { 
      return null; 
     } 

     return transformer; 
    } 
} 

然後,你可以這樣做:

var factory = new XmlTransformerFactory(); 

var transformerA = factory.Get<EntityA>(); 
string xmlA = transformerA.Transform(entityAInstance); 

var transformerB = factory.Get<EntityB>(); 
string xmlB = transformerB.Transform(entityBInstance);