我有一个帮助程序类。我应该考虑删除它吗?



我使用的是Telerik的AJAX Rad控件。我已经创建了自己的控件;它们的类继承自RadControl类。我继承的所有Telerik控件最接近的公共父类是'WebControl '。我正在讨论的控件都实现了ICormantControl,它没有太多的东西:

public interface ICormantControl<T>
{
    T GetSettings();
}

现在,在我的helper类中我有一些方法。我想从一个我认为最有可能做点什么的人开始。

    /// <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并让它实现保存,但这似乎比我上面的建议要差几个数量级。

我还有其他选择吗?

您需要的是一个扩展方法。把你的声明改成这样:

public static void Save<T>(this ICormantControl<T> control)

然后你就可以做dock.Save()而不需要修改ICormantControl接口或任何其他类

扩展方法将解决您的问题。如何编写扩展方法的示例。

通过Razor将HtmlHelper实例传递给另一个方法MVC3

 public static void Save<T>(this  ICormantControl<T> control)
 { 
 }

魔术就在这个关键字中,所以现在你可以使用doc. save(),这里指向doc。

相关内容

最新更新