0

此桌面应用程序的业务要求是某些视图上存在通用过滤器选项。这意味着对于那些包含通用过滤器选项的视图,如果我在一个视图上检查某个选项,则包含它的每个其他视图也需要检查相同的选项(许多视图已经显示,因此需要更新这些选项)。

CommonSettings { CommonSetting1, CommonSetting2, CommonSetting3, CommonSetting4, CommonSetting5  }
ScreenASettings {ScreenASetting1, ScreenASetting2, CommonSetting2, CommonSetting4 }
ScreenBSettings {ScreenASetting1, CommonSetting1, CommonSetting2, CommonSetting3 }
// and so on

此设置需要保存在文件中以供以后阅读。这个想法是,当屏幕打开时应用此设置。如果 ScreenA 和 ScreenB 都打开了,并且我更改了 ScreenA 上的 CommonSetting2,ScreenB 也应该为此设置应用新值,因为它也包含它。

我目前的设计是这样的: - 只有一个 CommonSettings 实例存在 - 我有 CommonSettingsViewModel,它包含对 CommonSettings 实例的引用。CommonSettingsViewModel 处理所有事情:在屏幕上显示选项(向 CommonSettingsView 公开常用设置、保存常用设置、加载常用设置等) - 每个包含自定义和常用设置的 CustomViewModel 都将(通过 DI)获取对 CustomSetting 和 CommonSettingViewModel 实例的引用。通过这种方式,它可以将创建通用设置的控制权传递给 CommonSettingViewModel,并且只处理其自定义设置(加载、保存)

使用这种方法,我将负责自定义和通用设置。我在这里看到的一个缺点是,当我需要查询数据时,我总是需要同时传递 CustomSettings 和 CommonSettings 实例,而我需要两者。

您认为这种方法正确吗,或者您认为有更好的方法?

编辑:这是我用于设置的当前实现

public interface ISettings {
    string ElementPath { get; set; }
    Exception Error { get; }
    object GetValue(string setting);
    bool HasError { get; }
    void Read();
    void Save();
    void SetValue(string setting, object value);
}

// base class for ScreenASettings, CommonSettings, etc
public abstract class SettingsBase : ISettings { ... }

// ancestor class only needs to add settings
public class CommonSettings : BaseSettings {
    private bool _ommonSetting1;
    [Setting]
    public bool CommonSetting1 { .... }
    // CommonSetting2, CommonSetting3, etc
}
4

1 回答 1

0

为什么不定义一个像这样的通用接口:

public interface ISettings
{
    T GetSetting<T>(string key);
    bool TryGetSetting<T>(string key, out T result);
}

然后,您可以接受ISettings任何函数的参数,并使用Composite 模式定义一个CompositeSettings可以表示多个其他对象的ISettings对象:

public class CompositeSettings : ISettings
{
    private IEnumerable<ISettings> settings;
    public CompositeSettings(params ISettings[] settings)
    {
        this.settings = settings;
    }

    public T GetSetting<T>(string key)
    {
        T result;
        if (TryGetSetting<T>(key, out result))
            return result;
        throw KeyNotFoundException(key);
    }

    public bool TryGetSetting<T>(string key, out T result)
    {
        foreach (var setting in this.settings)
        {
            T innerResult;
            if (setting.TryGetSetting<T>(out innerResult))
            {
                result = innerResult;
                return true;
            }
        }
        return false;
    }
}

(现在我读了一遍,也许我的命名并没有完全有帮助......可能ISettingsProvider更清楚)

于 2013-04-11T12:55:58.127 回答