2012-03-27 1 views
3

...ジェネリック型チェック(factory-ishパターン)をSOLID向けに改善しましたか?それはより多くの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

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); 
関連する問題