Элегантное решение для инициализации одного класса (но не другого) - PullRequest
1 голос
/ 31 марта 2012

У меня есть приложение, которое поддерживает два уровня доступа к данным: db4o и RavenDB.Логические классы делают такие вызовы, чтобы получить конкретный класс данных:

return DataAccessFactory.GetDataInterface<IApplicationData>().GetAll();

Вот метод в DataAccessFactory, который возвращает правильный конкретный класс ApplicationData (db4o или RavenDB):

public static T GetDataInterface<T>() where T : class
{
    T theObject = // Code here to get the object. Not relevant to this question.

    // Begin HACK

    DataAccessLayerBase theObjectAsRavenDalBase = theObject as DataAccessLayerBase;

    if (theObjectAsRavenDalBase != null)
    {
        theObjectAsRavenDalBase.SetAsInitialDalInstanceAndCreateSession();
    }

    // End HACK

    return theObject as T;
}

Хак, который я реализовал, приведёт к версии DataAccessLayerBase RavenDB и этому оператору if .Если конкретный класс оказывается классом RavenDB, то мне нужно вызвать метод для него.(DataAccessLayerBase, показанный здесь, находится в пространстве имен RavenDb. Db4o также является его собственным DataAccessLayerBase.)

Один из способов исправить это - каждый DataAccessLayerBase реализует общий метод, такой как Initialize ().Метод db4o Initialize () ничего не будет делать, а метод RavenDB Initialize () будет выполнять необходимую логику.Тогда этот метод мог бы просто вызвать Initialize () и не заботиться о том, какой именно это класс.

Есть ли лучший дизайн, чем этот? Я думаю, что исправление, которое я только что описал, достаточно прилично,но я не могу не думать, что что-то упустил.Я ищу лучший, более элегантный способ решить эту проблему.Один из недостатков предложенного мной подхода состоит в том, что другие слои доступа к данным должны затем реализовать Initialize (), даже если он мне нужен только для RavenDB.

Примечание: я не могу просто сделать так, чтобы конкретные классы выполняли эту инициализацию, когда они 'создается заново, потому что это должно происходить только при вызове DataAccessFactory.GetDataInterface <> ().

1 Ответ

0 голосов
/ 31 марта 2012

Еще одно решение - добавить свойство типа в интерфейс, реализованный вашими классами DataAccess.Затем вы можете проверить тип, чтобы узнать, нужно ли вам вызывать метод SetAsInitialDalInstanceAndCreateSession.Я думаю, что метод Initialize, который вы описали выше, также является хорошим решением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...