Невозможно получить данные из слоя DA. Что делать?

StackOverflow https://stackoverflow.com/questions/1415911

  •  06-07-2019
  •  | 
  •  

Вопрос

Разделяя свое приложение C # по слоям, я решил проблему циклической зависимости между слоями следующим образом:

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.

Если этот дизайн неэффективен, как я могу изменить / изменить его?

Это было полезно?

Решение

Насколько я понимаю, у вас двунаправленные отношения между вашим DA и бизнес-уровнем. Чтобы решить эту проблему, я предлагаю вам иметь 3 слоя вместо двух. Я имею в виду, что у вас должен быть слой Model, который просто моделирует объекты БД, а затем вы можете получить классы модели в вашем бизнес-уровне и добавить другие варианты поведения, такие как метод 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);
}
}
}

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

Другие советы

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

Единственный способ, которым вы действительно можете это сделать, - реализовать Get () для User, а не для 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(),
    };
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top