У меня есть приложение, которое поддерживает два уровня доступа к данным: 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 <> ().