Pregunta

Al dividir mi aplicación C # en capas, he resuelto el problema de la dependencia circular entre capas de la siguiente manera:

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

texto alternativo ??

Por favor, eche un vistazo a la clase MyClassDA en la capa DA y al ensamblaje mismo.

¿Cómo puede un método MyDA.Get () devolver objetos del tipo MyClass cuando la capa de acceso a datos no conoce el tipo MyClass?

Si este diseño no es eficiente, ¿cómo puedo cambiarlo / modificarlo?

¿Fue útil?

Solución

Hasta donde puedo entender, usted tiene una relación bidireccional entre su DA y la capa de negocios. Para resolver este problema, sugiero que debe tener 3 capas en lugar de dos. Quiero decir que debe tener una capa Modelo que simplemente modele los objetos DB, luego puede derivar de las clases modelo en su capa Business y agregar otros comportamientos como el método Save.

Esto es lo que quiero decir:

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

Estoy usando un decorador para combinar User y UserDao como objeto de modelo de dominio.

Otros consejos

Una de las razones por las que las personas hacen objetos ignorantes de persistencia (POCO) es para evitar tal escenario. Simplemente no hay forma de que la capa de acceso a datos tenga una referencia a una clase que desconoce: es mucho mejor que la clase no sepa sobre el acceso a datos.

La única forma en que realmente puede hacer esto es implementar Get () en User en lugar de en UserDA. Puedes hacer algo como esto:

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(),
    };
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top