在将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类型的对象。
如果此设计效率不高,我该如何更改/修改?
答案 0 :(得分:1)
人们做持久无知物体(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(),
};
}
}
答案 1 :(得分:1)
据我所知,您的DA与业务层之间存在双向关系。 为了解决这个问题,我建议你应该有3层而不是2层。我的意思是你应该有一个模型层来简单地建模数据库对象,然后你可以从业务层中的模型类派生,并添加其他行为,如Save方法。
这就是我的意思:
//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组合为域模型对象。