如何为各种实现创建通用接口?

时间:2019-06-22 10:16:33

标签: c# oop interface

我正在做一个小型运动项目,以期在编程方面有更多的练习。 该项目是一个程序,它接收CSV文件的内容并将其放入某个数据库中。 我从创建数据库访问界面IDatabaseClient开始,这使我想到了以下几点:

  1. 我的Connect(...)方法应如何显示?各种数据库可能具有连接所需的一组不同的凭据,即一个数据库可能需要连接字符串,另一个数据库可能需要:URL,用户名,密码等。解决此问题的一种方法可能是使用Connect方法像这样:

任务连接(IConnectionCredentials凭据);

IConnectionCredentials接口为空,每个数据库都有其自己的实现,例如:

public class DatabaseNo1Credentials : IConnectionCredentials
{
    public Uri Uri { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

我不喜欢这种解决方案的地方是IDatabaseClient实现的用户不知道应该使用哪种凭证类。如果提供了错误的凭据类,则代码将引发异常。有更好的解决方案吗?

  1. 我的CSV文件可能包含不同数据库表的数据。一个CSV可能包含Cars数据,另一个CSV可能包含People数据,等等。如何使IDatabaseClient可用于许多数据孩子?

我可以这样做:

public interface IDatabaseClient
{
    Task Connect(IConnectionCredentials credentials);
    Task WriteCars(string model, int productionYear);
    Task WritePeople(string firstName, string lastName, int age);
}

但是,如果有一天我想将数据写入Phones表或任何其他表怎么办?

1 个答案:

答案 0 :(得分:3)

就方法而言,尤其是在方法参数方面,您的界面过于具体。 您不应该使用带有参数的namespace App\Http\Controllers; 方法,而是这样做:

Connect

在我看来,在一个接口中具有多个数据库表特定的操作会破坏拥有一个接口的目的,因此您应该将特定的工作委托给其他类,这些类仅取决于IDatabaseClient:

interface IDatabaseClient
{
    Task ConnectAsync();

    Task AddDataAsync<T>(string databaseName, T data);
}

class DatabaseClient1 : IDatabaseClient
{
    public DatabaseClient1(string username, string password)
    {
        Username = username;
        Password = password;
    }

    public string Username { get;  }

    public string Password { get;  }

    public async Task ConnectAsync()
    {
        // connect using Username and Password
    }

    public async Task AddDataAsync<T>(string databaseName, T data)
    {
        // Not sure if you can work with a generic method for inserting data
        // into your database, but given that you didn't specify your 
        // requirements further, I'm just going to go with this
    }
}