Question

Tout en divisant mon application C # en couches, j'ai résolu le problème de la dépendance circulaire entre couches de la manière suivante:

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

Veuillez regarder la classe MyClassDA dans la couche DA et l'assemblage lui-même.

Comment une méthode MyDA.Get () peut-elle renvoyer des objets de type MyClass lorsque la couche d'accès aux données ne connaît pas le type MyClass?

Si cette conception n'est pas efficace, comment puis-je la modifier / la modifier?

Était-ce utile?

La solution

Autant que je sache, vous avez une relation bidirectionnelle entre votre couche DA et la couche Business. Pour résoudre ce problème, je suggère que vous ayez 3 couches au lieu de deux. Je veux dire que vous devriez avoir une couche de modèle qui modélise simplement les objets de base de données. Vous pouvez ensuite dériver des classes de modèle de votre couche de commerce et ajouter d'autres comportements tels que la méthode Save.

Voici ce que je veux dire:

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

J'utilise un décorateur pour combiner User et UserDao en tant qu'objet de modèle de domaine.

Autres conseils

L’une des raisons pour lesquelles les gens utilisent des objets persistants ignorants (POCO) est d’éviter un tel scénario. Il n’ya tout simplement aucun moyen pour la couche d’accès aux données d’avoir une référence à une classe qu’elle ne connaît pas - il est bien mieux que la classe ne connaisse pas l’accès aux données.

Pour ce faire, vous ne pouvez réellement implémenter que Get () sur User au lieu de UserDA. Vous pouvez faire quelque chose comme ceci:

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(),
    };
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top