我对使用数据库非常陌生,我想知道我在实现中是否犯了一些常见的设计缺陷。对于上下文,整个项目打算由单个用户使用。
我想要审查的代码:
class DatabaseConnection
{
//properties
private MySqlConnection _connection;
public MySqlConnection Connection { get { return _connection; } }
public AccountLogin AccountCredentials { get; }
public DatabaseLogin DatabaseCredentials { get; }
//constructor
public DatabaseConnection(AccountLogin _AccCred,
DatabaseLogin _DBCred)
{
AccountCredentials = _AccCred;
DatabaseCredentials = _DBCred;
}
public void Connect()
{
if (Connection != null)
{
return;
}
string[] UserInputs =
{
DatabaseCredentials?.DatabaseName,
DatabaseCredentials?.Server,
DatabaseCredentials?.Port,
AccountCredentials?.Password,
AccountCredentials?.Username
};
bool ChkInpts = Validators.NullStringValidator(UserInputs);
if (!ChkInpts)
{
string ConnInfo = "server=" + DatabaseCredentials.Server + ";" +
"user=" + AccountCredentials.Username + ";" +
"database=" + DatabaseCredentials.DatabaseName +
"port=" + DatabaseCredentials.Port +
"password=" + AccountCredentials.Password;
_connection = new MySqlConnection(ConnInfo);
try
{
Console.WriteLine("Connecting to " + DatabaseCredentials.DatabaseName + "...");
_connection.Open();
Console.WriteLine("Connection to " + DatabaseCredentials.DatabaseName + " successful.");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
public void Close()
{
_connection.Close();
}
}相关守则:
class AccountLogin
{
public string Username { get; }
public string Password { get; }
public AccountLogin(string _username, string _password)
{
Username = _username;
Password = _password;
}
}
class DatabaseLogin
{
public string DatabaseName { get; }
public string Server { get; }
public string Port { get; }
public DatabaseLogin(string _server, string _DatabaseName, string _port)
{
DatabaseName = _DatabaseName;
Server = _server;
Port = _port;
}
}
static class Validators
{
public static bool NullStringValidator(string[] _inputs)
{
bool _result = false;
for (int i = 0; i < _inputs.Length; i++)
{
if (string.IsNullOrEmpty(_inputs[i]))
{
return _result = true;
}
}
return _result;
}
}发布于 2018-08-24 12:23:40
C#中参数的常规命名是camelCase:
AccountLogin _AccCred
看上去更像
AccountLogin accountLogin我想知道:DatabaseCredentials?.DatabaseName是否有用?如果是DatabaseCredentials is null,那么您可以连接到哪个数据库?
如果DatabaseCredentials == null的话,我会抛出一个异常。这可能也适用于AccountCredentials。
字符串连接是构建字符串的一种效率很低的方法:
而不是
string ConnInfo = "server=" + DatabaseCredentials.Server + ";" +
"user=" + AccountCredentials.Username + ";" +
"database=" + DatabaseCredentials.DatabaseName +
"port=" + DatabaseCredentials.Port +
"password=" + AccountCredentials.Password;使用任何一种
StringBuilder或
String.Format("server={0};user={1};...", DatabaseCredentials.Server, AccountCredentials.Username,...);或
字符串插值:
$"server={DatabaseCredentials.Server};user={AccountCredentials.Username};..."MySqlConnection实现了IDisposable。因此,您的包装器也应该这样做,这样您就可以释放_connection对象,然后客户端可以像这样使用包装器:
using (DatabaseConnection dc = new DatabaseConnection(...))
{
// Use the connection...
}try-catch方法中的-statement对客户端没有任何用处,因为如果连接失败,则不会向客户端发出信号。要么重新抛出异常,抛出自己的新异常,要么简单地忽略这里的任何异常并让客户端处理它们。
在……里面
public void Close()
{
_connection.Close();
}您应该测试_connection == null。
https://codereview.stackexchange.com/questions/202359
复制相似问题