Лучший способ обобщить инициализацию объекта?

У меня есть следующий код для обобщения инициализации многих очень похожих объектов. Я обобщил код 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 заявление.

Другие вопросы по тегам