2013-11-10 37 views
1

我有一堆BLL對象,它們是模型第一場景中直接映射數據庫實體的對象。我通過這樣的接口得到通過BLL的DAL到表現層theese對象(從BLL層):通過BLL從DAL獲取對象到通過泛型演示文稿

public static ILanguage GetNewLanguage() 
    { 
     return new Language(); 
    } 


    public static bool SaveLanguage(ILanguage language) 
    { 
     return DAL.Repositories.LanguageRepository.Save(language); 
    } 

而在表示層,我只是通過這個調用獲取對象:

ILanguage language = BLL.Repository.GetNewLanguage();

現在,由於我有一堆對象,我想使BLL方法成爲泛型,所以我不必爲每個對象編寫相同的代碼。

但我不知道如何做到這一點。任何幫助appriciated,謝謝。

/Finn。

回答

0

那麼,它已經有一段時間,很抱歉的!

我成功地創建了一個通用方法。取而代之的是對每一個實體:

public static ILanguage GetNewLanguage() 
    { 
     return new Language(); 
    } 

我現在用的這個通用的方法(但我認爲這仍然是一個笨拙的方式來做到這一點):

public static T CreateNew<T>(out string errmsg) where T : class 
    { 
     errmsg = string.Empty; 

     // Loading the DAL assembly as you cannot allways be sure that it is loaded, 
     // as it can be used from the GAC and thereby not accessible as a loaded assembly. 
     AppDomain.CurrentDomain.Load("DAL"); 

     // From loaded assemblies get the DAL and get the specific class that implements 
     // the interface provided, <T>. 
     // It is assumed for the time being, that only one BLL dataobject implements the interface. 
     var type = AppDomain.CurrentDomain.GetAssemblies() 
      .SelectMany(s => s.GetTypes()) 
      .Where(p => typeof(T).IsAssignableFrom(p) && p.IsClass) 
      .FirstOrDefault(); 

     try 
     { 
      // Create an instance of the class that implements the interface in question, unwrap it 
      // and send it back as the interface type. 
      var s = Activator.CreateInstance("DAL", type.FullName); 
      return (T)s.Unwrap(); 
     } 
     catch (Exception ex) 
     { 
      errmsg = ex.ToString(); 
      return null; 
     } 

    } 

從表現層調用現在看起來像這樣:

string errmsg = string.Empty; 
ILanguage language = BLL.CreateNew<ILanguage>(out errmsg); 

我解決了明顯的問題,但仍然沒有花哨的方式。我有一個使用DI來解耦各個組件的想法,但我不知道如何做到這一點。評論非常好。如果我找到一個,我會在一個新線程中發佈一個解決方案。

而且我還會發佈一個解決方案,讓Crud的想法是如何在存儲庫類中將BLL從DAL中分離出來,並在一個新的線程中解決這個問題!

Cheers Finn。

+0

通用的方式肯定有它的缺點,因爲它比直線速度慢20-30倍。所以它取決於性能和你的個人風格實施什麼... –

0

爲每個實體類型創建一個存儲庫類可能會導致大量冗餘代碼。只需通過以下示例代碼就可以使用通用存儲庫模式執行此操作。

Here

+0

Roger,Crud!感謝您的看法,當我解決了問題中的實際核心問題時,我會仔細考慮它,即如何安裝正在實現特定界面的類,然後將其返回。也許我在通往DI的路上,但同時我進入了AppDomain.CurrentDomain.GetAssemblies()和Activator.CreateInstance。我會很快發佈解決方案。對已故的評論感到抱歉。乾杯... –