我的模型看起来像这样:
public class Task : ITask
{
public int DocumentId { get; set; }
public virtual Document Document { get; set; }
public TaskType TaskType { get; }
public string Value { get; }
}
现在,此类在DbSet
中直接注册为DbContext
。
这意味着Document
属性必须是具体类型。我想让这段代码很容易测试,所以我希望将属性作为ITask
接口所需的接口。解决这个问题的一般方法是什么?
我想到的一种方法是将所有这些类放在一个单独的程序集中,但这似乎有点过时了。
编辑:ITask
界面在不同的程序集中定义,因此它不应该知道Document
类型。
答案 0 :(得分:1)
接口可以在其中定义属性,因此您的ITask可以指定文档,如下所示:
public interface ITask {
Document Document { get; set; }
}
但是你也说你想把Document属性作为一个接口,因为你需要Task类中的具体类型,这变得很棘手。通用接口在这里会有所帮助。
// The interfaces
public interface ITask<TDocument> where TDocument : IDocument, new() {
TDocument Document { get; set; }
}
public interface IDocument {
int Number { get; set; } // Example property
}
//The classes
public class Document : IDocument{
public int Number { get; set; } // Example property
}
public class Task : ITask<Document> {
public Document Document { get; set; }
}
// See if it works
public class Test {
private Task myTask = new Task();
public void TestMethod() {
myTask.Document.Number = 1;
}
}
请记住,在DBContext中使用具体类型。
关于接口应该位于何处,相同的程序集或它们自己的接口,有很多观点。就个人而言,我把它们放在远离实施类的自己的程序集中。这个问题值得一读: Should I have a separate assembly for interfaces?
还有一个评论,类名称Task在.Net线程库中使用,所以也许值得考虑改变它以避免潜在的混淆。