غير قادر على الحصول على البيانات من طبقة 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();
        }
    }
}

يرجى إلقاء نظرة على MyClassDA فئة في طبقة DA والجمعية نفسها.

وكيف يمكن لMyDA.Get () الأجسام طريقة العائد من نوع MyClass عند طبقة الوصول إلى البيانات لا يعرف عن هذا النوع MyClass.

إذا هذا التصميم ليست فعالة، كيف يمكنني تغيير / تعديل ذلك؟

هل كانت مفيدة؟

المحلول

وبقدر ما أستطيع أن أفهم لديك علاقة ثنائية الاتجاه بين DA وطبقة رجال الأعمال. لحل هذه المشكلة أقترح أنه يجب أن يكون 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);
}
}
}

وأنا باستخدام الديكور الجمع بين المستخدم وUserDao ككائن نموذج المجال.

نصائح أخرى

واحدة من الأسباب الناس بيرسيستانسي الأجسام جاهلة (POCO) لتجنب مثل هذا السيناريو. وببساطة ليس هناك طريقة للطبقة الوصول إلى البيانات أن يكون إشارة إلى فئة أنه لا يعلم - هو أفضل بكثير لفئة لا تعرف عن الوصول إلى البيانات

والطريقة الوحيدة التي يمكنك القيام به حقا هذا هو تنفيذ الحصول على () على العضو بدلا من 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