简单的CRUD应用程序可学习n层架构

马修

会员
已加入
2020年8月15日
留言内容
23
编程经验
Beginner
嗨,大家好!
我想对一个非常简单的CRUD控制台应用程序使用n层体系结构。我有一个域层,表示层(控制台应用程序),业务层和数据访问层。
如果我是对的,则使用DAL与数据库进行交互,而BL是PL和DAL之间的一层。

因此,例如,如果我有一个带有“ Persons”表的数据库,并且每条记录都由名字和姓氏组成。
想象一下,在我的控制台应用程序中,我创建了一个“将人添加到数据库”之类的选项。
控制台应用程序要求用户填写名字和姓氏。
是BL从PL接收用户输入并将其提供给DAL,对吗?

为了熟悉整个n层体系结构,我创建了一个非常非常简单的控制台应用程序。
控制台应用程序可以向用户显示“人员”表中的所有记录,并且可以让用户将记录添加到“人员”表中。

首先,我在域层中创建了一个“ Person”类:
C#:
public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
       
        public Person(string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;
        }
       
        public override string ToString()
        {
            return $"{FirstName} {LastName}";
        }
    }

在DAL中,我创建了一个PersonRepository类,它使用一些方法来与存储“ Persons”表的数据库进行交互。由于目前不知道如何与数据库进行交互,因此创建了一个包含Person对象的列表,以表示“ Persons”表。我有一个静态方法Seed()用虚拟数据填充列表:
C#:
public class PersonRepository
    {
        private static readonly List<Person> _persons = new List<Person>();

        static PersonRepository()
        {
            Seed();
        }

        public Person ReadPerson(string firstName, string lastName)
        {
            return _persons.Find(p =>
                p.FirstName.ToLower() == firstName.ToLower() && p.LastName.ToLower() == lastName.ToLower());
        }

        public IEnumerable<Person> ReadPersons()
        {
            return _persons;
        }

        public void CreatePerson(Person person)
        {
            _persons.Add(person);
        }
       
        public static void Seed()
        {
            Person person1 = new Person("Anakin","Skywalker");
            _persons.Add(person1);
            Person person2 = new Person("Luke","Skywalker");
            _persons.Add(person2);
        }
    }

在BL中,我创建了一个PersonManager类,该类从表示层获取用户输入,并使其与DAL交互:
C#:
public class PersonManager
    {
        private readonly PersonRepository _personRepository = new PersonRepository();

        public Person GetPerson(string firstName, string lastName)
        {
            return _personRepository.ReadPerson(firstName, lastName);
        }

        public IEnumerable<Person> GetPersons()
        {
            return _personRepository.ReadPersons();
        }

        public void AddPerson(Person person)
        {
           Person p =  _personRepository.ReadPerson(person.FirstName, person.LastName);
           if (p == null)
           {
             _personRepository.CreatePerson(person);
           }
           else
           {
               throw new ArgumentException("A person with that first- and lastname already exists!");
           }
        }
    }

最后,我创建了一个控制台应用程序,以让用户确定他/她想要做什么:
C#:
class Program
    {
        private static readonly PersonManager _personManager = new PersonManager();

        static void Main(string[] args)
        {
            bool quit = false;
            do
            {
                Console.WriteLine("0) Quit");
                Console.WriteLine("1) View all persons");
                Console.WriteLine("2) Create person");
                Console.Write("Choice:");
                int choice;
                bool parseSucces = Int32.TryParse(Console.ReadLine(), out choice);
                if (parseSucces)
                {
                    switch (choice)
                    {
                        case 0:
                            quit = true;
                            break;
                        case 1:
                            Console.WriteLine($"\nAll persons:");
                            foreach (var p in _personManager.GetPersons())
                            {
                                Console.WriteLine($"\t -{p.FirstName} {p.LastName}");
                            }
                            break;
                        case 2:
                            Console.Write($"\nFirstname:");
                            string firstName = Console.ReadLine();
                            Console.Write("Lastname:");
                            string lastName = Console.ReadLine();
                            try
                            {
                                _personManager.AddPerson(new Person(firstName,lastName));
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine($"\n{e.Message}");
                            }

                            break;
                    }
                }
                else
                {
                    Console.WriteLine("Please, enter a number!");
                }

                Console.WriteLine();
            } while (!quit);
           
        }
    }

我认为我正在使用存储库服务模式。所以我可以说存储库服务模式可以在n层架构中使用吗?

谢谢!
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
这是我的看法:N层体系结构只需要将应用程序构建为多层即可。存储库-服务模式指示您的业务逻辑分为多个层。因此,满足了层要求。
 
最佳 底部