Лучший подход для вызова аналогичных методов на C # - PullRequest
2 голосов
/ 01 июня 2011

У меня есть классы Business Objects, которым необходимо знать, какую строку подключения следует использовать.

Я вызываю / создаю эти BO из своего кода, передавая строку подключения в свойство connString объекта BO, и может вызываться/ также создан из элементов управления фреймворка, и это не позволяет мне установить свойство connString.(Мне нужно вызвать метод с одним дополнительным параметром для строки подключения)

У меня есть что-то вроде этого:

public class MyBOClass{
    public FillMethodX(int ID)
    {
        //Fill the BO with data...
    };
    public FillMethodX(int ID, string connString)
    {
        SetConnString(connString);
        FillMethodX(ID);
    };

    public FillMethodY(int ID)
    {
        //Fill the BO with data...
    };
    public FillMethodY(int ID, string connString)
    {
        SetConnString(connString);
        FillMethodY(ID);
    };
}

Могу ли я избежать дублирования каждого метода с перегрузкой для передачи connString случший подход?(необязательный параметр, generics и т. д. ??)

Спасибо.

edit: извините, я поставил "строку подключения", но на самом деле я передаю строку, которая представляет базу данных, которую мои BO используют внутри.

Ответы [ 4 ]

1 голос
/ 01 июня 2011

Удалить метод без параметра и просто иметь:

 public FillMethodY(int ID, string connString)     
 {         SetConnString(connString);  //If connString is null, a default connection will be used       
           FillMethodY(ID);     
 }; 

Для вызывающих абонентов, которые хотят использовать значение по умолчанию, передайте значение null для connString, а затем в SetConnString обработайте нулевой случай и верните соединение по умолчанию. В противном случае он должен использовать то, что передано, если не ноль, и установить для этого соединение.

Тогда вам не нужен FillMethodY (int ID), и вызовы метода уменьшаются вдвое.

1 голос
/ 01 июня 2011

Вы можете создать в своем классе новый конструктор, принимающий ConnectionString, или создать открытое свойство ConnectionString, затем вы можете получить это значение внутри ваших методов.

public class MyBOClass{

private string connectionString;
public MyBOClass(string connectioString)
{
    this.connectionString=connectionString;
}

public FillMethodX(int ID)
{
    //here use connectionString
    //Fill the BO with data...
};

НТН

обновлен

с использованием необязательных параметров:

public class MyBOClass{


public FillMethodX(int ID,[Optional, DefaultParameterValue(string.Empty)] string connString)
{
    //test if connString is null 
    SetConnString(connString);
    FillMethodX(ID);
};
1 голос
/ 01 июня 2011

Есть много способов сделать это, один из которых вы уже упомянули - необязательные аргументы.

Другим способом было бы предоставить универсальное свойство ConnectionString, которое возвращает текущую строку соединения, а затем покончить с перегрузкой параметра 1. Вызывающие абоненты должны будут передать строку подключения и могут просто передать MyBOClass.ConnectionString. На самом деле это может быть немного понятнее читателям кода, которые задаются вопросом, откуда берется информация о соединении.

0 голосов
/ 01 июня 2011

Не передавайте строку подключения в слое BO.Вместо этого используйте идентификатор, а затем фабрику на своем уровне DAL, чтобы перейти и получить строку подключения / DAL.

Например, файл конфигурации DAL Dll:

<Connections>
    <connection name="test" connectionString="Data Source=####\SQL2008;Initial Catalog=test;User Id=####;Password=####;" providerName="System.Data.SqlClient">test</connection>
    <connection name="test2" connectionString="Data Source=####\SQL2008;Initial Catalog=test2;User Id=####;Password=####;" providerName="System.Data.SqlClient">test2</connection> 
</Connections>

Когда клиент входит в системув вашем приложении предоставьте им выпадающий список доступных соединений (или спрячьте его через файл конфигурации, если вы не хотите, чтобы пользователи выбирали соединение), а затем используйте его для фабрикации соединения с базой данных.

Объектыкоторые передаются между слоями, будут иметь этот идентификатор.Используйте идентификатор для создания соединения DAL.

Пример объекта передачи данных, который может передаваться между слоями (с идентификатором):

    /// <summary>
    /// A data transfer object is sent between layers.  It has a few base properties
    /// as well as a list of payload objects.
    /// </summary>
    [DataContract(Namespace= SharedModelNamespace.Namespace.SharedModel)]
    public class DataTransferObject
    {
        /// <summary>
        /// As part of the data transfer object, it specifies what environment to connect
        /// to should it make a DAL call.
        /// </summary>
        [DataMember]
        public string DataEnvironment {get; set };

        /// <summary>
        /// These are the list of objects (the payload) that will be transferred
        /// back and forth from the server to the client.
        /// </summary>
        [DataMember]
        public List<BasePOCO> DataTransferObjects { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...