我有3个班级
public class ActivityLog
{
// The activity log affects an employee
public int EmployeeID { get; set; }
public Employee Employee { get; set; }
// The activity log affects a department
public int DepartmentID { get; set; }
public Department Department { get; set; }
}
在这个例子中,有两种不同的对象类型可以在视图上显示,但实际上有更多不同的类型,并且将它移动到自己的继承模型似乎不明智。
我希望能够做到以下几点:
public class ActivityLog<T>
{
// The activity log affects an unknown type
public T ConcernedObjectID { get; set; }
public T ConcernedObject { get; set; }
}
现在我们在视图中有很多空检查(如果员工为空,则使用部门)。
这是实体框架可以以某种方式提供帮助的东西,还是最好是实现仅代码解决方案(例如接口)?
答案 0 :(得分:0)
我认为你这里有设计问题。 ActivityLog类尝试做太多。它既是员工和部门日志中的条目。哪些是完全不同的东西。他们唯一的共同点就是可以将它们放入活动日志中。
我要么使用通用接口,要么使用抽象基类。然后,您可以使用asp.net等效的数据模板来可视化数据。
这样的事情:
public abstract class ActivityLogEntry
{
int Id { get; }
}
public EmployeeActivityLogEntry : ActivityLogEntry
{
Employee Employee {get;}
}
public DepartmentActivityLogEntry : ActivityLogEntry
{
Department Department {get;}
}
可以帮助您进行空检查的另一件事是明确指出某些内容可以为null。我使用Optional NuGet包。这给你这样的东西
Option<Employee> Employee {get; }
public string ToString()
{
return this.Employee.Match(e => e.Name, () => "");
}
在这种情况下,您无法直接访问Option中捕获的Employee。相反,您必须提供Func
,以便在有员工(非空)时以及何时没有。可选库中有更多辅助函数。这使得你需要处理这两种情况更加清晰。你不能再对开始为空的东西感到惊讶。
(当然你不应该将Option<T>
用于所有内容。只在有时可能为null的属性上使用它。不应该在永远不应为null的属性上,或者你开始隐藏自己的bug。)