数据class的依赖倒置(class定义某种类型结构的es)
dependency inversion for data class(classes that define the structure of certain type)
所以我有这个数据class:
public class RecentProject
{
public string ProjectName { get; set; }
public string ProjectPath { get; set; }
public DateTime CreationDate { get; set; }
public string OutputFolder { set; get; } = "";
}
它只是定义了最近项目的属性,我想应用依赖倒置所以我从class中提取了一个接口:
public interface IRecentProject
{
DateTime CreationDate { get; set; }
string OutputFolder { get; set; }
string ProjectName { get; set; }
string ProjectPath { get; set; }
}
然后我做了一个ioc容器(控制反转)并注册了class类型作为接口:
Mvx.IoCProvider.RegisterType<IRecentProject, RecentProject>();
所以当我想创建一个最近的项目时,在我的应用程序的任何地方我只使用:
Mvx.IoCProvider.Resolve<IRecentProject>();
但在我这样做之后,我 运行 遇到了一些用当前设置很难解决的问题,所以我认为这可能不是在此 [=34= 中应用依赖倒置的正确方法] 因为 none 的依赖倒置好处将适用于:
- 单元测试:因为我不会对数据进行单元测试class
- 更改 class 实现的能力:因为 class 中的任何更改都需要更改界面才能使用添加的新功能
所以我该怎么办,我已经搜索了很多关于这个主题的内容,但找不到明确的答案,
请帮助并提前致谢。
如果RecentProject是一个纯数据class,也就是不包含任何逻辑,那么确实不需要单元测试和抽象。当然,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 仍然无关紧要(要注入服务,而不是数据模型)。
但是,您现在可以实例化适当的 class,同时仍然向外界“说”界面语言:
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);
}
所以我有这个数据class:
public class RecentProject
{
public string ProjectName { get; set; }
public string ProjectPath { get; set; }
public DateTime CreationDate { get; set; }
public string OutputFolder { set; get; } = "";
}
它只是定义了最近项目的属性,我想应用依赖倒置所以我从class中提取了一个接口:
public interface IRecentProject
{
DateTime CreationDate { get; set; }
string OutputFolder { get; set; }
string ProjectName { get; set; }
string ProjectPath { get; set; }
}
然后我做了一个ioc容器(控制反转)并注册了class类型作为接口:
Mvx.IoCProvider.RegisterType<IRecentProject, RecentProject>();
所以当我想创建一个最近的项目时,在我的应用程序的任何地方我只使用:
Mvx.IoCProvider.Resolve<IRecentProject>();
但在我这样做之后,我 运行 遇到了一些用当前设置很难解决的问题,所以我认为这可能不是在此 [=34= 中应用依赖倒置的正确方法] 因为 none 的依赖倒置好处将适用于:
- 单元测试:因为我不会对数据进行单元测试class
- 更改 class 实现的能力:因为 class 中的任何更改都需要更改界面才能使用添加的新功能
所以我该怎么办,我已经搜索了很多关于这个主题的内容,但找不到明确的答案,
请帮助并提前致谢。
如果RecentProject是一个纯数据class,也就是不包含任何逻辑,那么确实不需要单元测试和抽象。当然,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 仍然无关紧要(要注入服务,而不是数据模型)。
但是,您现在可以实例化适当的 class,同时仍然向外界“说”界面语言:
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);
}