数据类的依赖倒置定义某种类型结构的类

问题描述

所以我有这个数据类:

    public class RecentProject
    {
    public string ProjectName { get; set; }

    public string ProjectPath { get; set; }

    public DateTime CreationDate { get; set; }

    public string OutputFolder { set; get; } = "";
    }

它只是定义了最近项目的属性,我想应用依赖倒置所以我从类中提取一个接口:

    public interface IRecentProject
   {
    DateTime CreationDate { get; set; }
    string OutputFolder { get; set; }
    string ProjectName { get; set; }
    string ProjectPath { get; set; }
    }

然后我做了一个 ioc 容器(控制反转)并将类类型注册为接口:

Mvx.IoCProvider.RegisterType<IRecentProject,RecentProject>();

所以当我想创建一个我最近使用的项目时,在我的应用程序中的任何地方:

Mvx.IoCProvider.Resolve<IRecentProject>();

但是在我这样做之后,我遇到了一些使用当前设置难以解决的问题,所以我认为这可能不是在此类中应用依赖倒置的正确方法,因为没有任何依赖倒置好处适用喜欢:

  • 单元测试:因为我不会对数据类进行单元测试
  • 更改类实现的能力:因为类中的任何更改都需要更改界面才能使用添加的新功能

那我该怎么办,我在这个话题上搜索了很多,都没有找到明确的答案,
请提前提供帮助和感谢。

解决方法

如果RecentProject 是一个纯数据类,即它不包含逻辑,那么确实不需要单元测试或抽象。当然,IoC 不在此范围内。

当涉及到逻辑和多态时,事情看起来就不一样了。例如,您可能希望有两种类型的项目,每种类型都以自己的(简单的)方式实现名称验证:

public class RecentCSharpProject : IRecentProject
{
    .
    .
    .
    public string ProjectName
    {
        get => this.projectName;
        set
        {
            if (!value.EndsWith("csproj"))
            {
                throw (new Exception("This is not a C# project"));
            }
            this.projectName = value;
        }
    }
}

public class RecentFSharpProject : IRecentProject
{
    .
    .
    .
    public string ProjectName
    {
        get => this.projectName;
        set
        {
            if (!value.EndsWith("fsproj"))
            {
                throw (new Exception("This is not an F# project"));
            }
            this.projectName = value;
        }
    }
}

您仍然可以选择跳过单元测试,而且 IoC 仍然无关紧要(要注入的是服务,而不是数据模型)。​​

但是,您现在可以实例化适当的类,同时仍然可以向外界“说”界面语言:

public IRecentProject AddProjectToFileMenu(string projectName,bool isFSharp)
{
    IRecentProject project = (isFSharp ? new RecentFSharpProject() : new RecentCSharpProject());
    project.ProjectName = projectName; // Internally validate extension according to concrete class
    // TODO: add project to file-menu

    return (project);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...