在表格中传递信息

时间:2015-10-19 10:21:00

标签: c# forms winforms

这更像是一个理论问题,但我想知道在表格中传递信息的最佳方式是什么。我会解释我的问题:

我有Mainform课程来管理整个申请:

public class Mainform : Form
{
        private static AddressBook _addressbook = new AddressBook();
        private static TemplateManager _templateManager = new TemplateManager();
        /*...*/
}

此外,我有另一个由Mainform创建的类:

public partial class TemplateLists : Form
{
        //To be filled with Mainform's information.
        private List<Template> _genericTemplates;
        private Client _clientToFill;

        //In this case, I decided to pass the information through the constructor.
        public TemplateLists(List<Template> genericTemplates, Client client)
        {
            InitializeComponent();
            _genericTemplates = genericTemplates;
            _clientToFill = client;
        }
}

问题在于,为了TemplateLists收到_genericTemplates信息,我不知道是否最好通过构造函数,方法或公共属性以及原因来完成。在任何情况下,我都知道如何实现它们,但我不知道哪个是最好的,我没有任何理由选择一个而不是另一个。

3 个答案:

答案 0 :(得分:0)

最好使用依赖注入或服务位置。请查看thisthis以供参考。

答案 1 :(得分:0)

没有“最好的”解决方案。这真的取决于表单的使用方式。例如,它取决于通用模板是什么。如果它们是创建表单所必需的,那么通过构造函数传递它是个好主意,以防止表单实例化不完整。

如果它们是可选的,您可以在创建表单后指定。

实现细节(依赖注入,具体耦合等)取决于表单的使用方式。

答案 2 :(得分:0)

基本上你的整个问题可以归结为什么时候应该使用构造函数(ctor)参数和属性。

构造函数参数
这些应该用于在您的实例上设置强制值。换句话说,这些是您的类实例无法运行的值。

类属性
当值对象的运行可选时,应使用这些值。

考虑一个示例,其中您的类通过服务(然后与数据库等进行对话)来提取数据。您还打算执行某种日志记录。在这种情况下,您知道如果没有服务实例,您的类将无法工作,但您对此类的日志记录可以是可选的。因此,在实例化StoreManager时,您可以根据需要设置记录器。

public class StoreManager
{
    private readonly IService dataService;

    public StoreManager(IService dataService) 
    {
        if(dataService == null)
        {
            // Do not allow to go further.
            throw new ArgumentException();
        }

        this.dataService = dataService;
    }

    public ILogger Logger
    {
        get;
        set;
    }

    public IList<Product> GetProducts()
    {
        var products = dataService.GetProducts();

        // logging is optional
        if(Logger != null) {
            Logger.Trace("Products fetched {0}", products.Count);
        }
    }
}