【问题标题】:Setting up a proper nTier application设置适当的 nTier 应用程序
【发布时间】:2011-03-29 15:30:17
【问题描述】:

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

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

用户界面

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"];
        }

    }
}

数据提供者(业务 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 支持。

【问题讨论】:

  • 我建议您阅读 David Hayden 撰写的一些博客文章和文章,例如这个:davidhayden.com/blog/dave/archive/2005/07/22/2401.aspx
  • 如果你在玩这样一个小项目,扔掉你拥有的整个 DAL 并开始使用 EF 或 Linq-To-Sql 并摆脱 DBProvider,只需让你的 BL 调用Linq-To-Sql 或 EF 实体。如果你去EF,肯定去.net 4.0
  • 这最终将是一个相当大的项目,我只是想确保这不是我要在 6 个月后改变的事情。

标签: c# n-tier-architecture


【解决方案1】:

我完全同意 Jimmy Hoffa 的观点。在 2010 年,您不应该进行自定义数据访问,除非您有非常好的理由。你的头痛增加了三倍,任何必须支持该产品的开发人员都将在未来几年宣誓你的名字;)

像 nHibernate 和实体框架这样的 ORM,甚至是 Codesmith 或 T4 的代码生成,很久以前就解决了这个问题。

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

ORM -> Web 服务 -> UI,

如果您是一家仅限 MS 的商店,则等于: EF -> WCF(域服务/数据服务)-> ASP.NET (MVC)

【讨论】:

  • 好吧,也许只有我一个人,但我想我只是不明白 EF 以及如何像上面的代码一样将它连接到前端。我喜欢不编写所有数据访问代码的想法,但这似乎更容易。顺便说一句,该应用程序现在将使用带有一些 WCF 的 WebForms,而不是 MVC。但如果我有机会学习 MVC,那可能会发生变化。那么你有什么在 Web 表单上使用 EF 和 WCF 的好例子吗?
  • 我真的很喜欢使用 WCF 数据服务,您可以在几分钟内完成从数据库到实体模型再到 Web 访问的过程; msdn.microsoft.com/en-us/data/ee720180.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多