设置适当的nTier应用程序

时间:2010-08-13 19:14:22

标签: c# n-tier-architecture

虽然我知道有很多方法可以做到这一点,但我只是想知道这是否方式偏离基础。

我有一个包含三个DLL,UI(asp.net Web应用程序),业务层和DAL的解决方案。所以我的代码主要看起来像这样(非常原始的示例代码):

UI

protected void Page_Load(object sender, EventArgs e)
{
    Beanpole.Business.Project myProject = new Beanpole.Business.Project();
    myProject.LoadProject(Convert.ToInt32(Request["id"].ToString()));

    Response.Write(myProject.ProjectName + "<br>" + myProject.ProjectDescription);
}

BLL

using ...
using Business.Providers;

namespace Business
{
    public class Project
    {
        public string ProjectName { get; set; }
        public string ProjectDescription { get; set; }

        public bool LoadProject(int projectId)
        {
            DataTable dt = DBProvider.Instance().LoadProject(projectId).Tables[0];

            if (dt.Rows.Count == 0)
                return false;

            LoadProjectFromRow(dt.Rows[0]);
            return true;
        }

        internal void LoadProjectFromRow(DataRow row)
        {
            this.ProjectName = (string)row["Name"];
            this.ProjectDescription = (string)row["Description"];
        }

    }
}

数据提供商(Business dll)

namespace Business.Providers
{
    public class DBProvider
    {
        private static IDataAccess _getDataAccessComponent = null;
        public static IDataAccess Instance()
        {
            if (_getDataAccessComponent == null)
            {
                const string className = "My.Data.DataAccess, My.Data";

                _getDataAccessComponent = (IDataAccess)Activator.CreateInstance(Type.GetType(className));
            }
            return _getDataAccessComponent;
        }
    }
}

DAL界面

namespace My.Data
{
    public interface IDataAccess
    {
        DataSet LoadProject(int projectId);
    }
}

数据访问

namespace My.Data
{
    public class DataAccess : IDataAccess
    {
        public DataSet LoadProject(int projectId)
        {
            SqlParameter[] _params = new SqlParameter[1];
            _params[0] = new SqlParameter("@ProjectId", SqlDbType.Int) { Value = projectId };

            return SqlHelper.ExecuteDataset(connString, "up_LoadProject", _params);
        }
    }
}

我对此设置的主要问题是DBProvider类。由于某些原因它困扰我,我似乎无法弄清楚为什么,或摇动它并继续前进。这几乎就像它导致我的作家阻止。我有这个相同的模式在另一个应用程序中运行良好,一切都很好,但它似乎是很多额外的代码,没有收获。

任何提示都会有所帮助。

此外,我现在正在研究3.5,但是一旦我能够获得VS 2010,我就会考虑转向4.0。

编辑:刚刚在周末拿到了VS 2010,所以我将应用程序移到4.0,希望能获得更好的EF或LINQ to SQL支持。

1 个答案:

答案 0 :(得分:0)

我完全同意Jimmy Hoffa的观点。除非你有一个非常好的理由,否则你不应该在2010年进行自定义数据访问。在您将要在未来几年内咒骂您的名字之后,您的头痛和任何必须支持该产品的开发人员都会感到头疼;)

像nHibernate&amp; amp;很久以前,实体框架甚至Codesmith或T4的代码解决了这个问题。

整个n层堆栈现在几乎都是商品:

ORM - &gt;网络服务 - &gt; UI,

如果你是MS唯一的商店等于: EF - &gt; WCF(域服务/数据服务) - &gt; ASP.NET(MVC)