Лучший способ обобщить инициализацию объекта?
У меня есть следующий код для обобщения инициализации многих очень похожих объектов. Я обобщил код C# (как показано ниже). Кто-нибудь знает лучший способ? Это не так уж и плохо, но все же требует некоторого копирования / вставки, чего я бы хотел избежать.
private Tuple<SqlCommand, SqlCommand, SqlCommand, SqlCommand, SqlDataAdapter> initializeCommandsFor (string type) {
SqlCommand selectCommand;
SqlCommand insertCommand;
SqlCommand updateCommand;
SqlCommand deleteCommand;
SqlDataAdapter dataAdapter;
selectCommand = new SqlCommand("Get" + type + "Data", cntn);
selectCommand.CommandType = CommandType.StoredProcedure;
insertCommand = new SqlCommand("Insert" + type, cntn);
insertCommand.CommandType = CommandType.StoredProcedure;
updateCommand = new SqlCommand("Update" + type, cntn);
updateCommand.CommandType = CommandType.StoredProcedure;
deleteCommand = new SqlCommand("Delete" + type, cntn);
deleteCommand.CommandType = CommandType.StoredProcedure;
cntn.Open();
SqlCommandBuilder.DeriveParameters(selectCommand);
cntn.Close();
dataAdapter = new SqlDataAdapter(selectCommand);
dataAdapter.InsertCommand = insertCommand;
dataAdapter.UpdateCommand = updateCommand;
dataAdapter.DeleteCommand = deleteCommand;
return Tuple.Create(selectCommand, insertCommand, updateCommand, deleteCommand, dataAdapter);
}
private void customerCommands () {
var commands = initializeCommandsFor("Customer");
customerSelectCommand = commands.Item1;
customerInsertCommand = commands.Item2;
customerUpdateCommand = commands.Item3;
customerDeleteCommand = commands.Item4;
customerDataAdapter = commands.Item5;
}
private void competitorCommands () {
var commands = initializeCommandsFor("Competitor");
competitorSelectCommand = commands.Item1;
competitorInsertCommand = commands.Item2;
competitorUpdateCommand = commands.Item3;
competitorDeleteCommand = commands.Item4;
competitorDataAdapter = commands.Item5;
}
1 ответ
Решение
Я хотел бы создать метод расширения следующим образом:
public static class SqlDataAdapterExtension
{
public static void InitializeCommandsFor(this SqlDataAdapter adapter, string type)
{
SqlCommand selectCommand;
SqlCommand insertCommand;
SqlCommand updateCommand;
SqlCommand deleteCommand;
SqlDataAdapter dataAdapter;
adapter.SelectCommand = new SqlCommand("Get" + type + "Data", cntn);
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
adapter.InsertCommand = new SqlCommand("Insert" + type, cntn);
adapter.InsertCommand.CommandType = CommandType.StoredProcedure;
adapter.UpdateCommand = new SqlCommand("Update" + type, cntn);
adapter.UpdateCommand.CommandType = CommandType.StoredProcedure;
adapter.DeleteCommand = new SqlCommand("Delete" + type, cntn);
adapter.DeleteCommand.CommandType = CommandType.StoredProcedure;
cntn.Open();
SqlCommandBuilder.DeriveParameters(adapter.SelectCommand);
cntn.Close();
}
}
Тогда используйте это так:
var adapter = new SqlDataAdapter();
adapter.InitializeCommandsFor("Customer");
// Now the select, update, delete and insert commands are in your adapter
Я также изменил имя вашего метода, чтобы использовать нотацию Camel Case согласно соглашениям.NET.
Убедитесь, что если вы создаете класс расширения в другом пространстве имен, импортируйте это пространство имен с помощью using
заявление.