编程对象建议

时间:2011-12-16 01:50:38

标签: c# .net object data-access-layer

我知道这是一个很复杂的问题,可能会有很多很多答案,但是.....我正在创建一个小应用程序供我自己和其他一些朋友使用,如果有更多人喜欢它,我会把它分发给他们。这是一个简单的应用程序,用于跟踪健身人员的客户。它将跟踪客户,付款,付款历史,日程安排,文件(照片,电子邮件等),可能还有一点点,但整体上是一个非常简单的程序。哦,是的,使用SQLExpress作为后端。我的问题是:设计此应用程序所需对象的最佳方法是什么?我读过有关数据访问层和业务对象的文章,但从未真正从头开始创建。我正在考虑使用客户端,付款等对象,当然还有与它们一起使用的所有属性,但是当涉及到修改数据库时,添加,更新,删除等方法是否会进入对象或者它们是否存在驻留在DAL中,对象只是传入存储过程名称?

我知道有很多信息可能会丢失,但希望你能得到我想要做的事情的主旨(sp?)。

**回复一些帖子:

我同意让对象与dal分开,但是我需要阅读更多关于如何以这种方式设计的内容......再次,对于OO编程来说是新手,所以我看不到整个画面。

这是朋友制作的DAL并允许我使用它:

namespace DataAccess{
public class SQLDataBase
{
    public SQLDataBase();
    public SQLDataBase(string EncodedConnectionString);
    public SQLDataBase(string EncodedConnectionString, int ConnectionTimeout);

    public string ConnectionString { get; set; }
    public int ConnectionTimeout { get; set; }
    public string EncodedConnectionString { get; }

    public void RunSpGetScaler(string spName, SqlParameter[] parms, ref DateTime ReturnValue);
    public void RunSpGetScaler(string spName, SqlParameter[] parms, ref decimal ReturnValue);
    public void RunSpGetScaler(string spName, SqlParameter[] parms, ref int ReturnValue);
    public void RunSpGetScaler(string spName, SqlParameter[] parms, ref string ReturnValue);
    public DataSet RunSpReturnDS(string DatasetName, string spName);
    public DataSet RunSpReturnDS(string DatasetName, string spName, SqlParameter[] parms);
    public int RunSpReturnRecordCount(string spName);
    public int RunSpReturnRecordCount(string spName, SqlParameter[] parms);
    public string RunSpReturnString(string spName, SqlParameter[] parms, string returnParm);
    public SqlConnection RunSqlConnection();
}

}

非常简单......我唯一的问题就是当我创建任何对象来使用它时,我必须为每次调用DB编写方法....例如:

   //Declarations - which I don't thinkk should be in the object itself
    private DataAccess.SQLDataBase oDatabase = null;
    private string sEncodedConnectionString = app.Default.EncodedDBString;
    private int iConnectionTimeout = 15;

    public DataSet GetClientInformation(int iClinetID, string sClientName)
    {
        oDatabase = new SQLDataBase(
            sEncodedConnectionString, iConnectionTimeout);

        string spName = "GetClientInformation";
        string dsName = "GetClientInformation";

        try
        {
            SqlParameter[] Params = new SqlParameter[2];
            Params[0] = new SqlParameter("@ClientID", iClientID);
            Params[1] = new SqlParameter("@ClientName", sClientName);

            DataSet ds = oDatabase.RunSpReturnDS(dsName, spName, Params);
            return ds;
        }
        catch (Exception e)
        {
            throw (e);
        }
    }

因此,对于我的客户端对象,我已经有了这个以及其他几种为“客户端”添加,修改或选择数据的方法。从逻辑上讲,这对我来说没有意义,因为我似乎无法使用它而不必与它有一些其他依赖。

2 个答案:

答案 0 :(得分:3)

创建单独的图层可让您的应用程序分离关注点。 UI(和其他主机)访问面向对象的模型,该模型易于使用,而无需了解数据的存储方式。在像MVC这样的模式中,您甚至可以拥有一个控制器层,用于在视图和模型之间进行调解。另一个非常好的模式。

对象模型使用数据访问层,并且不知道如何存储和检索数据。数据访问层可以稍微更平坦并且更专注于能够有效地访问和写入数据。公共对象模型层需要是一个很好的面向对象的层,你可以保持压缩。

图层的其他原因:

  • 尽量减少更改的流失:您可以在影响尽可能少的图层,子系统和代码的同时更换存储方式。
  • 测试:您可以模拟完整图层以对高层进行单元测试。
  • 解密实现:您可以在等待其他层(或未来开发)的同时开始使用简单的图层(如文件等...)。

答案 1 :(得分:3)

我首先要阅读并理解N层架构。这应该有助于您了解逻辑单元分离和抽象的需求。从那里,如果您使用的是SQL Server和.NET,请将Microsoft Entity Framework视为您的数据访问层。它很容易上手,而且相当强大。