C# - 将UI与业务代码分开

时间:2011-02-27 19:29:05

标签: c# winforms model-view-controller design-patterns

我想知道以下情况的最佳做法是什么:

我正在开发一个需要在三种不同屏幕尺寸上使用的应用程序:240x320; 800x600; 1280x1024(只有这三个)用不同的语言(使用本地化)。

所以我所做的就是按屏幕大小创建一个库,每个库实现一个在项目中定义的接口,用于调用这些屏幕。

第一个问题是,我的所有资源文件都是重复的,这是许多文件要保持最新(或重复标签)。有没有一种简单的方法来改变它?

第二个问题是,我是使用好方法还是存在更好的方法来做我想做的事情?通过应用设计模式可能吗?


示例代码

来电者代码:

    public int X { get { return 800; } }
    public int Y { get { return 600; } }

    public interface IScreenForm
    {
        Form FormComponent { get; }
    }

    public interface IFormA : IScreenForm
    {
        TextBox UserTextBox { get; } // For use
    }

    public void LoadForm<T>()
        where T:IScreenForm
    {
        if (!typeof(T).IsInterface)
        {
            throw new ArgumentException(typeof(T).Name + " is not an interface");
        }

        Assembly screenAssembly;
        string screenResolutionDll = string.Format("{0}_{1}_screens.dll", this.X, this.Y);

        screenAssembly = Assembly.LoadFrom(screenResolutionDll);

        Type formType = screenAssembly.GetTypes()
            .FirstOrDefault(t => t.GetInterfaces().Where(i => i.Name == typeof(T).Name).Count() > 0);

        if (formType != null)
        {
            Form form = (Form)formType.GetConstructor(new Type[] { }).Invoke(null);
            if (form != null)
            {
                form.Show();
            }
            else 
            {
                throw new ArgumentException("Form doesn't provide a new() ctor");
            }
        }
        else
        {
            throw new ArgumentException("Any form doesn't implement the interface : " + typeof(T).Name);
        }
    }

屏幕DLL:

public partial class MyFirstForm : Form, caller.IFormA
{
    public Form1()
    {
        InitializeComponent();
    }

    /* caller.IFormA interface implementation */
}

2 个答案:

答案 0 :(得分:3)

Arnaud,根据我自己的经验,从阅读,到与经验丰富的开发人员交谈:当涉及支持多种屏幕尺寸和本地化时,没有神奇的子弹。对于本地化,将所有字符串放在资源文件中,甚至放在数据文件中。

就屏幕尺寸而言,我不会试图太聪明。是的,请确保您的业务/非GUI逻辑没有重复,但重复资源文件,表单等 - 我不担心它。一些GUI框架,如Qt和GTK自动调整大小和自动定位GUI小部件(例如Qt有'spacer'小部件)。它大部分时间都可以正常工作,但我仍然更喜欢明确的控制。使用GUI编程时,通常会出现意想不到的故障,如果出现这些组件,可以使用三组独立的GUI组件来解决它们。一些示例问题来源: 1)字体大小。 2)Windows辅助功能设置。 3)有些国家的语言比其他语言有更长的平均单词,长单词在现有的房地产中很难适应。

如果我在你的鞋子里,我会查看浏览器如何处理这个问题(例如移动版和桌面版),我会尝试在网上找到一些实用的建议(比如这里的SO)。我怀疑有关设计模式的书籍会对此有所帮助。免责声明:我是设计模式的怀疑论者。

答案 1 :(得分:1)

如果不了解整体情况,很难提供建议,但有些技巧可能会通过方便的方式阅读

http://msdn.microsoft.com/en-us/library/ff648753.aspx

关于SmartClient软件工厂。

它提供了针对您在此类应用中经常看到的问题的架构指导和解决方案