2014-04-08 78 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身邊,在我看來這不會是一件壞事;)無論如何,你可能有興趣閱讀它