Я использую Telerik Rad Controls для AJAX.Я создал свой собственный контроль;их классы наследуются от классов RadControl.Ближайшим общим родительским классом для всех элементов управления Telerik, от которых я наследую, является «WebControl».Все элементы управления, которые я обсуждаю, реализуют ICormantControl, в котором нет ничего особенного:
public interface ICormantControl<T>
{
T GetSettings();
}
Теперь в моем классе помощников у меня есть несколько методов.Я хотел бы начать с того, что, как мне кажется, у меня больше всего шансов сделать что-то.
/// <summary>
/// Saves a control -- writing it to Session and the DB.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="control"></param>
public static void Save<T>(ICormantControl<T> control)
{
T settings = control.GetSettings();
string controlID = ((ISetting)settings).ID;
SerializableDictionary<string, T> states = GetStates<SerializableDictionary<string, T>>();
bool isKnown = states.ContainsKey(controlID);
if (isKnown)
{
Logger.DebugFormat("{0} is known. Overwriting data.", controlID);
states[controlID] = settings;
}
else
{
Logger.DebugFormat("{0} is unknown. Saving data.", controlID);
states.Add(controlID, settings);
}
SetStates<SerializableDictionary<string, T>>(states);
}
В настоящее время, чтобы сохранить состояние элемента управления, я, например, вызываю StateManager.Save<RadDockSetting>(dock)
.
Я полагаю, что лучшая реализация позволила бы мне сказать: dock.Save()
.
Насколько я понимаю, я застрял между камнем и наковальней.У меня сложилось впечатление, что если я перенесу объявление Save в мой интерфейс ICormantControl, то мне придется перенести реализацию Save в каждый из элементов управления, которые реализуют ICormantControl.Это привело бы к большому количеству дублированного кода.
Должен ли я оставить свою реализацию в своем вспомогательном классе, переместить объявление в ICormantControl, а затем в каждом классе, который реализует ICormantControl, я перенаправить реализацию на свойвспомогательный метод?
Насколько я могу судить, я не могу наследовать все свои элементы управления от промежуточного класса.Общий родительский элемент находится слишком далеко в иерархии унаследованных родительских элементов управления.Может быть возможно расширить WebControl и реализовать в нем функцию Save, но это кажется на несколько порядков хуже, чем мое предложение выше.
У меня есть другие варианты?