我试图在这里最大化我的代码重用。我有SearchQueryDto
字段,如下所示:
public class SearchQueryDto{
// some other properties
public string SearchUsername { get; set; } // repetition 1
public string SearchProfile { get; set; } // repetition 1
public SearchInterest SearchInterest { get; set; } // repetition 1
// some other properties
}
然后,我有Broadcast
的数据库模型,其中包含以下内容:
public class Broadcast {
// some other different properties
public string SearchUsername { get; set; } // repetition 1
public string SearchProfile { get; set; } // repetition 1
public SearchInterest SearchInterest { get; set; } // repetition 1
// some other different properties
public Status Status {get; set;} // repetition 2
public DateTime DateStarted {get; set;} // repetition 2
}
然后,我有BroadcastMessage
的数据库模型,其中包含以下内容:
public class BroadcastMessage {
// some other properties
public Status Status {get; set;} // repetition 2
public DateTime DateStarted {get; set;} // repetition 2
}
目前,添加新的搜索条件意味着我必须向我的数据库模型Broadcast
和DTO添加字段。如何在两个类之间共享属性?继承似乎不是答案,因为我最终可能会在Broadcast
和其他类型之间共享属性。
我正在寻找简单的东西,例如:
// handles repetition 1
public class SearchCriteria{
public string SearchUsername { get; set; }
public string SearchProfile { get; set; }
public SearchInterest SearchInterest { get; set; }
}
// handles repetition 2
public class StatusProperties{
public Status Status {get; set;}
public DateTime DateStarted {get; set;}
}
public class SearchQueryDto: SearchCriteria{
// some other properties
}
public class Broadcast : SearchCriteria, StatusProperties{ // multiple inheritance :(
// some other different properties
}
public class BroadcastMessage : StatusProperties{
// some other properties
}
我不认为继承会因Broadcast
的需要而有效,而且我不认为接口会起作用,因为我已朝错误的方向迈出了一步 - 更新{为了方便编译器强制执行继承(而不是我正在寻找的方便),{1}}而不只是n+1
个东西。
我也不想在另一个类的实例化背后隐藏这些属性,原因我认为这些属于超出范围。
答案 0 :(得分:2)
我不是使用共享容器类或继承的忠实粉丝,因为在我看来,这会将模型,DTO对象,ViewModel和其他分离的类组合在一起。 我认为这是在每个类中实现属性的最佳解决方案。
但我认为使用界面来避免遗忘属性是没有问题的。
public interface IBroadcastMessage{
public Status Status {get; set;}
public DateTime DateStarted {get; set;}
}
public class Broadcast : IBroadcastMessage, ISearchQueryDto { /* ... */ }
public class BroadcastMessage : IBroadcastMessage { /* ... */ }
这无助于避免类似的代码,恰恰相反,您必须再次编写所有属性。但是如果你在界面中实现它,你就不会忘记在所有类中实现它
像这样的接口也可以在其他地方有用。例如传递IBroadcastMessage
并且不关心它的确切类型。
在这种情况下,重构怎么样?如果您可以创建一个可以根据继承的实现过滤项目并将它们添加到列表中的基类,为什么要为每个新条件添加属性?只是一个想法。
答案 1 :(得分:0)
创建一个两个类都有实例的对象。 SearchCriteria的更新会更新这两个类中的属性。你的两个班级(广播和profilesearchdto)仍然是分离的。
SearchCriteria{
public string SearchUsername { get; set; }
public string SearchProfile { get; set; }
public SearchInterest SearchInterest { get; set; }
}
public class ProfileSearchDto {
public SearchCriteria searchCriteria {get; set;}
}
public class Broadcast {
public SearchCriteria searchCriteria {get; set;}
}