Frage

Während meiner C # Anwendung in Schichten teilen, habe ich das Problem der zirkulären Abhängigkeit zwischen Schichten in der folgenden Art und Weise gelöst:

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

Bitte werfen Sie einen Blick auf die Klasse MyClassDA in der DA-Schicht und der Baugruppe selbst.

Wie kann ein MyDA.Get () -Methode Rückkehr Objekte vom Typ MyClass, wenn die Datenzugriffsschicht nicht weiß, über den MyClass-Typen.

Wenn dieser Entwurf nicht effizient ist, Wie kann ich es ändern / ändern?

War es hilfreich?

Lösung

Soweit ich verstehe, können Sie eine bidirektionale Beziehung zwischen DA und Business-Schicht haben. Zur Lösung dieses Problems schlage ich vor, dass Sie drei Schichten anstelle von zwei haben sollten. Ich meine, man sollte eine Modellschicht hat, die einfach die DB-Objekte modellieren, dann können Sie von Modellklassen in Ihrer Business-Schicht ableiten und andere Verhaltensweisen wie Save-Methode hinzuzufügen.

Hier ist, was ich meine:

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

Ich bin mit einem Dekorateur User und UserDao als Domain-Modellobjekt zu verbinden.

Andere Tipps

Einer der Gründe, warum Menschen tun Persistance Ignorant Objekte (POCO) ist ein solches Szenario zu vermeiden. Es gibt einfach keine Möglichkeit für die Datenzugriffsschicht einen Verweis auf eine Klasse zu haben, die es nicht kennt -. Es viel besser ist es, die Klasse hat nicht über den Datenzugriff weiß

Die einzige Möglichkeit, dies wirklich tun können, ist Get () auf Benutzer zu implementieren, anstatt auf UserDA. Sie können etwas tun:

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(),
    };
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top