2009-09-12 2 views
-1

Разбивая мой C приложения # в слоях, я решил проблему круговой зависимости между слоями следующим образом:Невозможно получить данные из уровня DA. Что делать?

using System; 
using System.Collections.Generic; 
using System.Text; 

using SolvingCircularDependency.Common; 
using SolvingCircularDependency.DA; 

namespace SolvingCircularDependency.BO 
{ 
    public class MyClass : IPersistent 
    { 
     private string _message; 
     public string Message 
     { 
      get { return _message; } 
      set { _message = value; } 
     } 

     public bool Save() 
     { 
      return MyClassDA.Save(this); 
     } 
    } 
} 


using System; 
using System.Collections.Generic; 
using System.Text; 

namespace SolvingCircularDependency.Common 
{ 
    public interface IPersistent 
    {   
     bool Save(); 
     string Message { get;} 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Text; 

using SolvingCircularDependency.Common; 

namespace SolvingCircularDependency.DA 
{ 
    public class MyClassDA 
    { 
     public static bool Save(IPersistent obj) 
     { 
      Console.WriteLine(obj.Message); 

      return true; 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Text; 

using SolvingCircularDependency.BO; 

namespace SolvingCircularDependency.UI 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyClass myobj = new MyClass(); 
      myobj.Message = "Goodbye Circular Dependency!"; 
      myobj.Save(); 

      Console.ReadLine(); 
     } 
    } 
} 

alt text

Пожалуйста, обратите внимание на класс MyClassDA в слое DA и сама сборка.

Как метод MyDA.Get() возвращает объекты типа MyClass, когда уровень доступа к данным не знает о типе MyClass.

Если этот проект неэффективен, как его изменить или изменить?

+1

Это невероятно плохо сформулированный вопрос. Я прочитал ваш другой пост, но я понятия не имею, что вы ищете. Можете ли вы переформулировать это, указав свою проблему более конкретно? –

+0

Я тоже не понимаю, о чем вы спрашиваете. Какой код должен представлять? Я не вижу класс UserDA в любом месте. Что означает «экземпляры интерфейса не могут быть материалами с данными, полученными SqlDataReader»? –

+0

С какой частью у вас проблемы? Вы вообще не знаете, как делать доступ к данным? –

ответ

1

Насколько я понимаю, у вас есть двунаправленную связь между вашим DA и бизнес-слоя. Чтобы решить эту проблему, я предлагаю вам иметь 3 слоя вместо двух. Я имею в виду, что у вас должен быть слой модели, который просто моделирует объекты БД, тогда вы можете получить из классов модели в своем бизнес-слое и добавить другие способы поведения, такие как метод Save.

Вот что я имею в виду:

//Model Layer 
public class UserModel 
{ 
public virtual string Firstname{get;set;} 
} 
//DataAccess Layer 
public class UserDao 
{ 
List<UserModel> GetAll(); 
} 
//BusinessLayer 
public class UserDomainModel:UserModel 
{ 
public UserDomainModel(UserModel user,UserDao dao) 
{ 
_user=user; 
_dao=dao; 
} 
public override string FirstName 
{ 
get 
{ 
return _user.FirstName; 
} 
set 
{ 
_user.FirstName=value; 
} 

public void Save() 
{ 
_dao.Save(_user); 
} 
} 
} 

Я использую декоратора, чтобы объединить пользователей и UserDao в качестве модели объекта домена.

+0

Что вы лично делаете, чтобы разделить ваше приложение среди слоев, сохраняя при этом круговую зависимость отчужденной? – anonymous

+0

На самом деле я не совмещаю свою модель с функциональностью доступа к данным. Класс Model не знает о DataAccess – Beatles1692

1

Одной из причин, по которым люди делают упорство Невежественные объекты (POCO) - это избежать такого сценария. Нет простого способа, чтобы уровень доступа к данным имел ссылку на класс, о котором он не знает - гораздо лучше, чтобы класс не знал о доступе к данным.

Единственный способ, которым вы действительно можете это сделать, - реализовать Get() для пользователя вместо UserDA. Вы можете сделать что-то вроде этого:

public class User { 
    IGetFromPresistance<User> _userFetcher; 
    public static IList<User> GetMatching(Specification<User> spec) { 
    var values = _userFetcher.Find(spec); //Returns a DataRow or IDictionary<string, object> 
    return new User() { 
     PhoneNumber = new PhoneNumber(values["phone"].ToString()), 
     Name = values["name"].ToString(), 
    }; 
    } 
} 
+0

Как мне изменить архитектуру для достижения лучшего дизайна? – anonymous

+0

Я большой поклонник того, как Sharp Architecture делает это: http://sharparchitecture.net/ загружает файлы и ищет там документ - он имеет подробное описание шаблона, процесс описан также в целом в этой статье : http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx В основном у вас есть объект доступа к данным в DAL с нестационарными методами, такими как UserDao.GetById (int id): User и UserDao.Save (Пользователь пользователя). Пользователь ничего не знает о проблемах с сохранением - он ТОЛЬКО описывает бизнес-объект пользователя –

+0

Каждый UserDao также основан на IUserDao.Интерфейс находится в доменном слое, а уровень DA зависит от домена (но домен не зависит от DA). Если вам действительно нужно, у вас могут быть бизнес-объекты с использованием IUserDao, и конкретная реализация вводится в них с более высокого уровня. Кстати, на протяжении всего курса статей, описывающих этот шаблон, термин DAO и Repository используются несколько взаимозаменяемо, хотя хардкорные DDD-парни будут утверждать, что есть большая разница. –

 Смежные вопросы

  • Нет связанных вопросов^_^