2010-08-13 1 views
0

Хотя я знаю, что есть много способов сделать это, мне просто интересно, является ли это способом вне базы.Настройка правильного приложения nTier

У меня есть решение, в котором есть три DLL, UI (веб-приложение asp.net), бизнес-уровень и 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 длл)

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 прямо сейчас, но думать о переезде в 4,0 раз я могу получить VS 2010.

Edit: Просто взял VS 2010 в выходные дни, так что я двигаюсь приложение над до 4.0 в надежде на улучшение поддержки EF или LINQ to SQL.

+0

Я предлагаю вам прочитать некоторые сообщения и статьи в блоге, которые написал Дэвид Хейден, например это: http://davidhayden.com/blog/dave/archive/2005/07/22/2401.aspx –

+1

Если вы работаете с небольшим проектом вроде этого, подбросьте весь DAL, который у вас есть, и начните использовать EF или Linq -To-Sql и избавиться от DBProvider, просто сделайте свой BL-вызов для объектов Linq-To-Sql или EF. Если вы идете на EF, обязательно перейдите в .net 4.0 –

+0

В конце концов, это будет довольно большой проект, я просто пытаюсь убедиться, что это не то, что я в конце концов перейду через 6 месяцев. –

ответ

0

Я собираюсь полностью согласиться с Джимми Хоффа. Вы не должны делать пользовательский доступ к данным в 2010 году, если у вас нет удивительно веской причины. Вы пытаетесь улучшить свою головную боль и любой разработчик, который должен поддерживать этот продукт после того, как вы будете приписывать свое имя на долгие годы;)

ORMs, например nHibernate & Entity Framework или даже код с Codesmith или T4 решили эту проблему давным давно.

Весь стек Многозвенное довольно много товар прямо сейчас:

ORM -> Web Services -> UI,

который, если вы единственный MS магазин равен: EF -> WCF (услуги домена/услуги передачи данных) -> ASP.NET (MVC)

+0

Хорошо, может быть, это только я, но я думаю, что я просто не понимаю EF и как подключить его к интерфейсу, как я делаю вышеприведенный код.Мне нравится идея не писать весь этот код доступа к данным, но это кажется почти проще. Кстати, приложение на данный момент будет использовать WebForms с некоторыми WCF, а не MVC. Но это может измениться, если я смогу получить шанс узнать MVC. Итак, есть ли у вас хорошие примеры использования EF с WCF на веб-формах? –

+0

Мне очень нравится использовать службы данных WCF, вы переходите от базы данных к модели сущности к веб-доступу в считанные минуты; http://msdn.microsoft.com/en-us/data/ee720180.aspx – Doobi