2014-04-08 37 views
1

类,我有以下的代码库:动态初始化实现一个通用接口

public abstract class Business 
{ 
    public BusinessType BusinessType { get; set; } 
} 

public class BusinessA : Business 
{ 
    public string SpecialA { get; set; } 
} 

public class BusinessB : Business 
{ 
    public string SpecialB { get; set; } 
} 

通用接口和类均实现该接口:

public interface IBusinessMapper<T> 
{ 
    void DoMapping(T business); 
} 

public class BusinessMapperA : IBusinessMapper<BusinessA> 
{ 
    void DoMapping(BusinessA business) 
    { 
     //... 
    } 
} 

public class BusinessMapperB : IBusinessMapper<BusinessB> 
{ 
    void DoMapping(BusinessB business) 
    { 
     //... 
    } 
} 

现在我想创建一个实例类BusinessMapperA或BusinessMapperB取决于某些值。是否有可能使用类似这样的东西?:

public class Core 
{ 
    public void Process(Business newBusiness) 
    { 
     var mapper = GetBusinessMapper(newBusiness.BusinessType); 
     mapper.DoMapping(); 
    } 

    private IBusinessMapper<T> GetBusinessMapper(BusinessType businessType) 
    { 
     switch (businessType) 
     { 
      case BusinessType.A: 
       return new BusinessMapperA(); 

      case BusinessType.B: 
       return new BusinessMapperB(); 

      default: 
       throw new Exception("Not supported"); 
     } 
    } 
} 

回答

0

是的,你可以在某些情况下使用此。这叫做Abstract Factory,或者它的一些形状。或者Factory Method,这可能最适合您的情况。

其基本思想是提供一个函数/类,其中不指定某些具体的类型,但是“指示”关于期望的类型,工厂构造实际对象的实例。

1

根据交换机情况,创建IBusinessMapper<T>的实例并不是一个推荐的想法,因为它引入了抽象(接口)和实现之间的强大耦合。

你可以使用多态调度:一个Business类可能能够返回它自己的映射器。例如:

public abstract class Business 
{ 
    public BusinessType BusinessType { get; set; } 
    public abstract IBusinessMapper GetMapper(): 
} 

但是由于您的映射器是通用接口,因此无法从该方法返回通用类型;即使你的开关盒也无法做到。我宁愿查看将字符映射到其字典中的映射器,或者使用IoC来解析IBusinessMapper<T>,具体取决于业务对象的类型。

所以,你的解决方法将成为:

private IBusinessMapper<T> GetBusinessMapper<T>() 
{ 
    // find what class implements IBusinessMapper for the type that's being passed 
} 

有很多方法来解决你所需要的类:

  • 寻找实现a specific interface
  • 使用IoC框架
  • 饲养班跟踪Business班级与IBusinessMapper<>之间的关系

编辑展望想法有点多,我发现this question值得一读。我真的不确定接受的答案和开关类型,并且发现我宁可靠在Jon Skeet和Marc Gravell身边,在我看来这不会是一件坏事;)无论如何,你可能有兴趣阅读它