我是C#(winforms)创建对象的新手,需要知道最好的方法。我有一个简单的对象,它将从我们的数据库中返回一些数据。通常情况下,我会将DS字符串(已编码)放入对象中并完成,但我发现的问题是,这并不能使对象真正“移动”以便能够在我们的任何应用程序中使用(网或窗口)。那么,最好是在构造函数中创建一个需要编码的db字符串的对象,或者我应该怎么做呢?
这就是我的想法:
public class foo
{
public foo(string EncodedConnectionString)
{
_EncodedConnectionString = EncodedConnectionString;
}
private string _EncodedConnectionString { get; set; }
private DataSet GetFooFromDB()
{
oDatabase = new SQLDataBase(
EncodedConnectionString, 15);
//remaining code omitted...
}
}
思考,评论?
答案 0 :(得分:2)
我在代码中改变的是:
public class foo
{
private SQLDataBase _sqlDataBase;
public foo(SQLDataBase sqlDataBase)
{
_sqlDataBase = sqlDataBase;
}
}
现在,您可以使用依赖注入来测试代码。连接字符串是外部添加的,因此您可以更改数据库而无需重新编写/重写大量代码。
答案 1 :(得分:2)
实际上,在持久性方面,对象本身应该是不可知的。我的意思是,对象既不应该关心也不应该知道它们是如何被存储/加载的。
有多种方法可以实现持久性。一种方法是使用DAL(数据访问层),它知道如何加载和存储与对象关联的数据。但请记住,即使DAL也没有硬编码的连接字符串,而是应该根据需要从配置文件中提取它。
这里有一个简单的例子:http://www.radsoftware.com.au/articles/dataaccesslayerdesign1.aspx就个人而言,我不同意有关如何完成的所有内容,但这是了解它们的一个很好的起点。
有关更高级的阅读,请查看实体框架http://msdn.microsoft.com/en-us/library/bb399572.aspx
另一种方法是使用Inversion of Control和Dependency Injection。我们的想法是,您的对象将具有Save()
和Load()
方法,这些方法接受执行实际持久性的某种类型的接口。 http://msdn.microsoft.com/en-us/library/aa973811.aspx
这样做有点复杂,但需要支付股息,并可根据需要灵活地更换存储库。这意味着支持多个数据库后端甚至将对象存储在csv / xml文件中要简单得多。