Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将远程数据访问(通过http)逻辑与业务逻辑分开?_C#_Design Patterns_Model View Controller - Fatal编程技术网

C# 如何将远程数据访问(通过http)逻辑与业务逻辑分开?

C# 如何将远程数据访问(通过http)逻辑与业务逻辑分开?,c#,design-patterns,model-view-controller,C#,Design Patterns,Model View Controller,我很好奇在以下实现中使用什么样的设计模式是最好的:我正在创建一个小应用程序,用于从网站下载图像并将其设置为我的背景。 我想连接一个网站,下载一个XMLBackground.XML文件,并下载另一个文件(Background.bmp),该文件托管在此远程服务器上。文件是位图,XML是关于位图的元数据。下载文件后,我想将其设置为我的背景。我想将文件下载代码与背景设置代码分开,但我不确定我将使用哪种设计模式 这似乎是一个典型的表示/数据/业务应用程序,表单是表示层,后台setter/XML解析器是业务

我很好奇在以下实现中使用什么样的设计模式是最好的:我正在创建一个小应用程序,用于从网站下载图像并将其设置为我的背景。

我想连接一个网站,下载一个XML
Background.XML
文件,并下载另一个文件(
Background.bmp
),该文件托管在此远程服务器上。文件是位图,XML是关于位图的元数据。下载文件后,我想将其设置为我的背景。我想将文件下载代码与背景设置代码分开,但我不确定我将使用哪种设计模式

这似乎是一个典型的表示/数据/业务应用程序,表单是表示层,后台setter/XML解析器是业务层,下载程序是数据层。但我不确定实际的数据访问将使用哪种设计模式,因为它将来自网站而不是数据库(因此DAO可能不适合这种情况)。我也买过设计图案,但似乎没有什么是对的。这就是我可以使用MVC的原因吗

数据层

public class DataLayer {
    public void DownloadFile() { 
        // download the file from http
    }
    public void GetXmlMetaData() { }
}
public class BusinessLayer {
    private static BusinessLayer m_instance = new BusinessLayer();  
    public static Instance BusinessLayer { get { return m_instance; }
    private BusinessLayer() { }

    public void SetNewWallpaper() { 
        // download the file from data layer
        // set it as the background
    }
    public String GetWallpaperInfo() { return String.Empty; }
}
public class PresentationLayer {
    public void HandleButtonClick(Object sender, EventArgs e) {
        BusinessLayer.Instance.SetNewWallpaper();
    }
}
业务层

public class DataLayer {
    public void DownloadFile() { 
        // download the file from http
    }
    public void GetXmlMetaData() { }
}
public class BusinessLayer {
    private static BusinessLayer m_instance = new BusinessLayer();  
    public static Instance BusinessLayer { get { return m_instance; }
    private BusinessLayer() { }

    public void SetNewWallpaper() { 
        // download the file from data layer
        // set it as the background
    }
    public String GetWallpaperInfo() { return String.Empty; }
}
public class PresentationLayer {
    public void HandleButtonClick(Object sender, EventArgs e) {
        BusinessLayer.Instance.SetNewWallpaper();
    }
}
表示层

public class DataLayer {
    public void DownloadFile() { 
        // download the file from http
    }
    public void GetXmlMetaData() { }
}
public class BusinessLayer {
    private static BusinessLayer m_instance = new BusinessLayer();  
    public static Instance BusinessLayer { get { return m_instance; }
    private BusinessLayer() { }

    public void SetNewWallpaper() { 
        // download the file from data layer
        // set it as the background
    }
    public String GetWallpaperInfo() { return String.Empty; }
}
public class PresentationLayer {
    public void HandleButtonClick(Object sender, EventArgs e) {
        BusinessLayer.Instance.SetNewWallpaper();
    }
}

如何将数据访问部分与后台设置逻辑分离?

您正处于模式化阶段。很多人都经历了这个阶段。当您了解模式、学习了其中一些模式并且已经想将其应用到任何可以应用的地方时,就会出现这种情况

尝试用某种模式编写代码,只是为了实现其中的一些模式,这不是最佳实践。不要为代码本身编写代码。尽量以最简单、最干净的方式解决业务任务,这是最好的方法。模式应该能帮助你做到这一点

您已经将代码的不同层分开了,这很好。您的体系结构非常简单,接近MVC。我认为你应该到此为止,不要增加复杂性

关于DAO,它意味着数据访问对象。关于数据库一点消息也没有。DAO可以为您提供对任何数据源的访问:数据库、缓存、nosql存储、文件、数据仓库(您的案例)等。这非常好,因为您可以动态更改应用程序的数据源,只要它们实现统一接口,就可以在它们之间切换

我很好奇在未来的设计中使用什么样的设计模式是最好的 后续实施

基于什么标准?下载一个文件并使用它执行X操作,与构建飞机维护和零件跟踪系统不同。复杂性、软件生命周期、团队规模、预算、时间框架都会影响“最佳方法”

一旦您知道了为什么要应用哪个软件设计原则,那么它就更容易到位了

我想把文件下载代码从后台分离出来 设置代码 但我不确定我会使用哪种设计模式

为什么??是的,这是一个很好的做法,但有理由分开。减少bug、增加代码重用、促进更好的单元测试、删除依赖项、简化维护、解耦。。。 你可以:

a) 将所有代码放在一个方法中是一个极端。
b) 在一个类中使用许多方法。升级
c) 下一步将在项目中分离类。基本OO
d) 在解决方案中创建单独的项目。更多设计模式
e) 构建相互沟通的独立解决方案。另一个极端

考虑到您对应用设计原则的偏好,您最有可能考虑C)或D)

您选择的选项本身可以有变体,例如依赖项注入/控制模式反转。但是我建议你不要在前面就这么做。听起来你的应用程序有点过头了

这似乎是一个典型的演示/数据/业务应用程序

是的,但90%以上的项目将以某种方式进行。拥有你不提供的数据没有多大意义。没有数据的演示没有多大意义

考虑到您在发帖时的代表人数接近2K,您显然可以编写代码。 所以我建议: 用3个项目构建一个解决方案

  • 数据存取
  • 业务层
  • 演示文稿
  • 一个只包含简单类(POCO)和基本对象逻辑的核心模型项目
  • 依赖注入/控制反转
  • 只有非常热心时才考虑4或5,在您对1/2/3/4类型的解决方案感到满意之前,DI/IOC可能是最好的选择

    避免从前端项目引用/调用数据访问项目

    核心模型不应参考其他项目

    这就是我可以使用MVC的原因吗

    是的,你可以。前端项目有一个控制器(或2个),控制器在前端项目中“调用”视图。视图仅显示并从用户处获取数据。控制器调用另一层。例如,控制器调用业务流程层,可能会多次调用数据层,以获取所有必需的信息并对其进行更新

    如果您想了解更多有关MVC的信息,请查看这里。 这些教程并不总是清晰地“分开”,因为它们集中在MVC方面。 事实上,您将看到控制器中的数据访问。这是演示者在实际项目中永远不会做的

    使用基本MVC模式的单个项目对于小型一次性应用程序来说已经足够了。多个项目使“演示”复杂化。但是想象一下你想要一个Windows WPF版本的应用程序。以及查看MVC项目中的数据访问代码。那里没有太多的重复使用。这更好地解释了为什么分离是好的

    祝你好运