如何在C#中实现工厂设计模式

时间:2016-12-20 10:30:51

标签: c# asp.net design-patterns factory-pattern

我正在尝试在我的应用程序中实现Factory pattern

参考这些链接,我正在努力实施,但坚持在一个地方&不确定如何继续。

  

请在这里找到" //混淆我如何在这里实施"评论我的   代码来解决我被困的问题。

 //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;
    }

有人可以指导我实施工厂模式+改进我的代码片段吗?

任何帮助/建议都非常感谢。

2 个答案:

答案 0 :(得分:1)

  1. 请勿使用此类内容:

    IReportHandler dal = new ReportFactory();

  2. 因为它使你对接口的依赖变得毫无用处并且创建了与具体实现的耦合。而是使用依赖注入容器并通过构造函数参数或属性注入此类工厂。最受欢迎的DI容器是Castle Windsor,Ninject,Unity,Autofac等。

    如果您不想使用容器 - 至少在程序入口点的一个位置创建所有具体实现,请在服务定位器中注册所有实现(了解更多信息)并传递服务通过构造函数定位到层次结构。

    1. 尽量避免使用静态方法。请改用接口。您希望拥有依赖于抽象的代码,并且可以轻松测试和模拟。

答案 1 :(得分: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;
    }
}