我正在设计一个读取和写入 SQL Server 数据库的应用程序。我有多个类,它们只是表记录的实例(这正确地称为模型吗?)我想创建一个接口(IDataModel)供模型使用。我还想创建一个接口 (IDataModelUpdatable),其中包含由那些将使用 IDataModel 作为参数类型更新到数据库的模型实现的更新方法签名。我遇到的问题是,当我实现 IDataModelUpdatable 方法时,我无法使用模型的属性,因为它们不在 IDataModel 中。每个模型都有独特的属性,需要参考。据我了解,接口的目的是能够交换对象,只要它们实现相同的接口。有没有办法使用 IDataModel 作为参数,但引用实际类的属性?
我尝试过转换为具体类类型,甚至尝试将具体类转换为接口类型(IDataModel)。这些都不起作用。我开始认为,为了使用 IDataModel 作为参数类型,它将需要所有属性才能引用它们(这是不可行的。
internal interface IDataModel {
int ID { get; set; }
}
internal interface IDataStoreUpdatable {
void Update(IDataModel model);
void Update(List<IDataModel> models);
}
public void Update(IDataModel bom) {
transaction = new CommittableTransaction();
string updateString = $@"UPDATE tblBOMs SET lngPalletSectionID = {bom.PalletSection.ID}, lngQuoteID = {bom.QuoteID}, strComponent = '{bom.Component}',
bytQuantityNeeded = {bom.QuantityNeeded}, sngBDFT = {bom.BoardFeet} WHERE lngBOMID = {bom.ID}";
OpenConnection();
_sqlConnection.EnlistTransaction(transaction);
您在数据模型中寻找的不是接口,而是抽象类。这将允许您定义模型一次,然后允许其他对象继承这些定义。您可以用它们做更多的事情,但对于您的具体示例来说,这将满足您的需要。然后,您可以将该抽象类传递给您的方法。请注意,您需要定义计划在该方法中引用的每个字段。因此,例如,当您在事务中调用类中未定义的字段时,这是行不通的。示例如下:
public abstract class DataModel
{
public int Id { get; set; }
//define all of your fields here
}
public class MyDataModel : DataModel
{
//this class will now have Id because of it's inheritance
}
至于你的方法的接口,你可以 100% 使用那里的接口来确保你调用每个 CRUD 方法,并且根据你的 IDE,如果你允许的话,会自动为你搭建它们的脚手架。示例如下:
public interface IDatabaseWork
{
public void Create(DataModel model);
public void Update(DataModel model);
public void Delete(DataModel model);
}
public class DatabaseWork : IDatabaseWork
{
public void Create(DataModel model)
{
//adding this to show you can reference the inherited field
var id = model.Id;
//work here
}
public void Update(DataModel model)
{
//work here
}
public void Delete(DataModel model)
{
//work here
}
}
这应该可以帮助您入门。您可能还想深入研究接口的使用,以了解依赖注入等概念和其他好处。