2011-12-19 56 views
2

我有這樣的方法:不同之處僅在傳遞給它們的類我可以將派生類中的這些方法與基類中的方法合併嗎?

public void AddOrUpdate(Product product) 
    { 
     try 
     { 
      _productRepository.AddOrUpdate(product); 
     } 
     catch (Exception ex) 
     { 
      _ex.Errors.Add("", "Error when adding product"); 
      throw _ex; 
     } 
    } 


    public void AddOrUpdate(Content content) 
    { 
     try 
     { 
      _contentRepository.AddOrUpdate(content); 
     } 
     catch (Exception ex) 
     { 
      _ex.Errors.Add("", "Error when adding content"); 
      throw _ex; 
     } 
    } 

加上更多的方法。

是否有某種方法可以在基類中編寫這些方法,而不是在每個派生類中重複該方法?我正在考慮基於泛型的東西,但我不知道如何實現,也不知道如何傳入_productRepository。

僅供參考這裏的_productRepository和_contentRepository的定義方式:

private void Initialize(string dataSourceID) 
    { 
     _productRepository = StorageHelper.GetTable<Product>(dataSourceID); 
     _contentRepository = StorageHelper.GetTable<Content>(dataSourceID); 
     _ex = new ServiceException(); 
    } 
+0

框架? – 2011-12-19 06:49:17

+0

不使用實體框架 – 2011-12-19 06:58:11

回答

5

當然可以。

簡單的方法是使用接口和繼承。緊密耦合

另一種方法是依賴注入。失去耦合,更好。

還有一種方法是如下使用泛型:

public void AddOrUpdate(T item ,V repo) where T: IItem, V:IRepository 
{ 
    repo.AddOrUpdate(item) 
} 


class Foo 
{ 
    IRepository _productRepository; 
    IRepository _contentRepository 

    private void Initialize(string dataSourceID) 
    { 
     _productRepository = StorageHelper.GetTable<Product>(dataSourceID); 
     _contentRepository = StorageHelper.GetTable<Content>(dataSourceID); 
     _ex = new ServiceException(); 
    } 

    public void MethodForProduct(IItem item) 
    { 
     _productRepository.SaveOrUpdate(item); 
    } 

    public void MethodForContent(IItem item) 
    { 
     _contentRepository.SaveOrUpdate(item); 
    } 

} 

// this is your repository extension class. 
public static class RepositoryExtension 
{ 

    public static void SaveOrUpdate(this IRepository repository, T item) where T : IItem 
    { 
     repository.SaveOrUpdate(item); 
    } 

} 

// you can also use a base class. 
interface IItem 
{ 
    ... 
} 

class Product : IItem 
{ 
    ... 
} 

class Content : IItem 
{ 
    ... 
} 
+0

你能給我一個我如何稱通用的例子。 T和V的意義是什麼? – 2011-12-19 06:57:28

+1

我已更新答案。 – DarthVader 2011-12-19 07:04:05

+0

這是一個很好的答案@DarthVader – 2011-12-19 07:05:50

相關問題