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

DA 레이어의 MyClassda 클래스와 어셈블리 자체를 살펴보십시오.

데이터 액세스 계층이 myClass 유형에 대해 알지 못할 때 myda.get () 메소드 유형 myclass의 객체를 반환하는 방법은 어떻게 할 수 있습니까?

이 디자인이 효율적이지 않으면 어떻게 변경/수정할 수 있습니까?

도움이 되었습니까?

해결책

내가 이해할 수있는 한 당신은 당신의 DA와 비즈니스 계층 사이의 양방향 관계를 가지고 있습니다. 이 문제를 해결하려면 2 개 대신 3 개의 레이어가 있어야합니다. DB 객체를 단순히 모델링하는 모델 계층이 있어야한다면 비즈니스 계층의 모델 클래스에서 파생하고 저장 메소드와 같은 다른 동작을 추가 할 수 있습니다.

내가 의미하는 바는 다음과 같습니다.

//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);
}
}
}

Decorator를 사용하여 사용자와 userdao를 도메인 모델 객체로 결합합니다.

다른 팁

사람들이 영구 무지 대상 (POCO)을하는 이유 중 하나는 그러한 시나리오를 피하는 것입니다. 데이터 액세스 계층이 모르는 클래스에 대한 참조를 할 수있는 방법은 없습니다. 클래스가 데이터 액세스에 대해 알지 못하는 것이 훨씬 낫습니다.

실제로 이것을 할 수있는 유일한 방법은 userDA 대신 사용자에서 get ()를 구현하는 것입니다. 당신은 다음과 같은 일을 할 수 있습니다 :

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