这更像是一个理论问题,但我想知道在表格中传递信息的最佳方式是什么。我会解释我的问题:
我有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
信息,我不知道是否最好通过构造函数,方法或公共属性以及原因来完成。在任何情况下,我都知道如何实现它们,但我不知道哪个是最好的,我没有任何理由选择一个而不是另一个。
答案 0 :(得分:0)
答案 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);
}
}
}