2016-12-20 131 views
1

我試圖在我的應用程序中實現Factory pattern如何在C#中實現工廠設計模式#

參考這些鏈接,我試圖實現,但堅持在一個地方&不知道如何繼續。

請找 「//這裏弄得我怎麼在這裏實現」 以我 代碼註釋,以獲得我在哪裏卡住了。

//DAL Layer 
public interface IReportHandler 
{ 
    IEnumerable<DocumentMapper> FetchDocumentsList(Guid clientId, int pager = 0); 


} 



public class ReportHandler : IReportHandler 
{ 
     public IEnumerable<DocumentMapper> FetchDocumentsList(Guid clientId, int pager = 0) 
    { 
      //implentation of the method 
    } 
} 



//BLL 
public interface IReportFactory 
{ 
    IReportHandler Create(int factoryId); 
} 

public class ReportFactory : IReportFactory 
{ 
    private IReportHandler reportObj; 

    public override IReportHandler Create(int factoryId) 
    { 
     switch (factoryId) 
     { 
      case 1: 
       reportObj = new ReportHandler(); 
       return reportObj; 
      default: 
       throw new ArgumentException(""); 
     } 


    } 
} 

//UI Layer 
    public String GetAllDocuments(string url,int pager =0) 
    { 
     if (SessionInfo.IsAdmin) 
     { 
      string documents ; 
      //call GetDocumentIntoJson() private method 

     } 
     else 
     { 
      return "Sorry!! You are not authorized to perform this action"; 
     } 
    } 


    private static string GetDocumentIntoJson(int clientId, int pager) 
    { 
     // confused here how do I implement here 
     IReportHandler dal = ReportFactory 
     var documents = dal.FetchDocumentsList(clientId, pager); 
     string documentsDataJSON = JsonConvert.SerializeObject(documents); 

     return documentsDataJSON; 
    } 

有人可以指導我實現工廠模式+提高我的代碼片段?

任何幫助/建議高度讚賞。

+0

你最初的意圖是什麼,你認爲你需要一個工廠? – guillaume31

+0

我投票結束這個問題作爲題外話題,因爲它也被代碼審查的同一個人問及他們已經給了一些非常好的答案在那裏http://codereview.stackexchange.com/questions/150382/工廠爲報告處理程序 –

回答

0

你的UI層的類需要的ReportFactory

public class UIclass 
{ 
    private readonly IReportFactory _reportFactory; 

    public UIclass(IReportFactory reportFactory) 
    { 
     _reportFactory = reportFactory; 
    } 

    private string GetDocumentIntoJson(int clientId, int pager) 
    { 
     // Use factory to get a ReportHandler 
     // You need provide "factoryId" from somewhere too 
     IReportHandler dal = _reportFactory.Create(factoryId); 

     var documents = dal.FetchDocumentsList(clientId, pager); 
     string documentsDataJSON = JsonConvert.SerializeObject(documents); 

     return documentsDataJSON; 
    } 
} 
例如
+0

不知道爲什麼這是投票,因爲它基本上是正確的。你可以做的唯一的另一種方式就是將方法放在方法中,這會使接口完全不相關。 –

+0

除了'靜態' - 這是奇怪的,在OP的代碼。 –

+0

@MichaelCoxon,你可以請檢閱我更新的實施http://codereview.stackexchange.com/questions/150382/is-this-the-right-way-to-implement-factory-pattern –

1
  1. 不要使用這樣的事情:

    IReportHandler DAL =新ReportFactory();

因爲它使你無法依賴接口並創建耦合到具體的實現。而是使用依賴注入容器並通過構造函數參數或屬性注入此類工廠。最流行的DI容器溫莎城堡,Ninject,團結,Autofac等

如果你不想使用的容器 - 在服務至少建立在程序入口點一個地方,所有的具體實現,註冊所有實現Locator(詳細瞭解它)並通過構造函數將Service Locator傳遞給層次結構。

  1. 儘量避免使用靜態方法。改用接口。你想擁有取決於抽象的代碼,並且可以很容易測試和嘲弄。
+0

指出注意。謝謝 –