Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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# 在基于类的环境中分离关注点/代码结构(以C为例)_C#_Class_Structure_Soc - Fatal编程技术网

C# 在基于类的环境中分离关注点/代码结构(以C为例)

C# 在基于类的环境中分离关注点/代码结构(以C为例),c#,class,structure,soc,C#,Class,Structure,Soc,我一直想知道在基于类的语言中分离代码的最佳实践是什么。作为一个例子,我制作了一个处理api与web api交互的项目。我想知道正确的选择是什么,或者另一个建议 例1 项目文件 Api.cs 数据类型 动漫 第二集 Api.cs public class Api { public static async Task<List<Anime>> GetAnimesByKeyword(string keyword) { // Execute

我一直想知道在基于类的语言中分离代码的最佳实践是什么。作为一个例子,我制作了一个处理api与web api交互的项目。我想知道正确的选择是什么,或者另一个建议

例1

项目文件

  • Api.cs
  • 数据类型
    • 动漫
    • 第二集
Api.cs

public class Api
{
    public static async Task<List<Anime>> GetAnimesByKeyword(string keyword)
    {
        // Execute api request to server
        return result;
    }

    public static async Task<List<Episode>> GetEpisodesByAnime(Anime anime)
    {
        // Execute api request to server
        return result;
    }

}
public class Api
{
    // Nothing for now
}
数据类型->插曲.cs

public class Episode
{
    public string Name { get; set; }
    public Date ReleaseDate { get; set; }
    // Other properties
}
public class Episode
{
    public static async Task<List<Episode>> GetEpisodesByAnime(Anime anime)
    {
        return result;
    }

    public string Name { get; set; }
    public Date ReleaseDate { get; set; }
    // Other properties
}
或例2

项目文件

  • Api.cs
  • 数据类型
    • 动漫
    • 第二集
Api.cs

public class Api
{
    public static async Task<List<Anime>> GetAnimesByKeyword(string keyword)
    {
        // Execute api request to server
        return result;
    }

    public static async Task<List<Episode>> GetEpisodesByAnime(Anime anime)
    {
        // Execute api request to server
        return result;
    }

}
public class Api
{
    // Nothing for now
}
数据类型->Anime.cs

public class Anime
{
    public string Name { get; set; }
    public string Summary { get; set; }
    // Other properties
}
public class Anime
{
    public static async Task<Anime> GetById(int id)
    {
        return result;
    }

    public string Name { get; set; }
    public string Summary { get; set; }
    // Other properties
}
公共类动漫
{
公共静态异步任务GetById(int id)
{
返回结果;
}
公共字符串名称{get;set;}
公共字符串摘要{get;set;}
//其他属性
}
数据类型->插曲.cs

public class Episode
{
    public string Name { get; set; }
    public Date ReleaseDate { get; set; }
    // Other properties
}
public class Episode
{
    public static async Task<List<Episode>> GetEpisodesByAnime(Anime anime)
    {
        return result;
    }

    public string Name { get; set; }
    public Date ReleaseDate { get; set; }
    // Other properties
}
公共课插曲
{
公共静态异步任务GetEpiosodesbyAnime(Anime Anime)
{
返回结果;
}
公共字符串名称{get;set;}
公共日期ReleaseDate{get;set;}
//其他属性
}
这两种方法中哪一种是构建代码的首选方法,或者有更好的方法来实现这一点。这似乎无关紧要,但对我来说确实很重要

谢谢你帮助我

一般情况下,遵循以下步骤。在实践中,这意味着您拥有仅为数据的简单对象和更复杂的服务类,它们的工作方式类似于从外部服务或数据库加载

您的第二个示例混合了关注点,它将这两个类紧密地绑定在一起(
插曲
现在取决于
动画
)。您还可以看到,很难决定将加载方法放在哪个类上:它应该是
anime.getscents()
还是
scention.getepositesbyanime()
?随着对象图变得越来越复杂,这种情况会升级

稍后,您可能需要为实体使用不同的数据传输对象。使用简单的纯数据对象可以轻松添加这些对象,并使用
Automapper
进行转换

但是(在第一个示例中)不要使用
静态方法,因为这会使服务类更难测试。一个服务可能依赖于另一个服务(使用依赖项注入),为了单独测试每个服务,您不希望使用静态方法