0

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

任何人都可以建议我任何更好的解决方案,因为 sln 中的“通用”项目对我来说是多余的吗?

4

3 回答 3

2

由您决定是否应在 Common 或 Service 程序集中声明 IPersistent。最佳实践(通常)是在单独的程序集中声明接口以实现更好的层分离。您需要考虑开发人员创建 IPersistent 实现的频率,是否真的需要松散耦合等。

于 2009-09-12T18:04:00.217 回答
1

请注意依赖倒置原则。

于 2009-09-12T18:06:22.247 回答
0

IPersistence 是您 DA 关心的问题,也是您的 BO 通过它进行交流的一种方式。这种关系应该到此为止。您的 UI 应该只知道您的 BO,如果您需要定义一个新接口来支持“编码到合同”,请在您的 BO 中定义一个新接口。你的 UI 和 BO 应该对他们在系统中所做的事情有不同的关注。

例如,IPersistence 接口将定义将记录持久保存到数据库的特定任务。您不希望在您的 UI 中使用它,因为它会绕过您的 BO。因此,除非您想要一个虚弱的 BO,它真的什么都不做,根本不应该存在,否则请在该级别定义与支持您的业务逻辑相关的新内容。

于 2009-09-12T18:46:01.503 回答