-1

在将我的 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();
        }
    }
}

替代文字

请查看 DA 层中的 MyClassDA 类和程序集本身。

当数据访问层不知道 MyClass 类型时,MyDA.Get() 方法如何返回 MyClass 类型的对象。

如果这种设计效率不高,我该如何更改/修改它?

4

2 回答 2

1

人们使用 Persistance Ignorant objects (POCO) 的原因之一是为了避免这种情况。数据访问层根本无法引用它不知道的类——最好让类不知道数据访问。

真正做到这一点的唯一方法是在 User 上而不是在 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(),
    };
  }
}
于 2009-09-12T19:51:37.567 回答
1

据我了解,您的 DA 和业务层之间存在双向关系。为了解决这个问题,我建议你应该有 3 层而不是 2 层。我的意思是你应该有一个模型层来简单地对数据库对象进行建模,然后你可以从业务层中的模型类派生并添加其他行为,如保存方法。

这就是我的意思:

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

我正在使用装饰器将 User 和 UserDao 组合为域模型对象。

于 2009-09-12T20:01:02.133 回答