对于静态类工作模式库单位

问题描述 投票:-1回答:1

分配给我的任务是重构代码,但should't修改类的静态访问修饰符。我想实现的服务层,工作单位,仓库模式。静态库的代码如下,我怎么能实现工作和存储库模式的单位静态类?我喜欢实现施加固体原则和单元测试应用的解决方案。

静态类

 using System;
  using System.Data.SqlClient;

  namespace Contoso
  {
    public static class UsersRepository
    {
        private static string ConnectionString = @"Data Source=(local);    Database=Users;User Id=sa;Password=password;";

        public static User Load(int userId)
        {
            User user = new User();

            SqlConnection connection = new SqlConnection(ConnectionString);
            connection.Open();

            SqlCommand command = new SqlCommand("SELECT * FROM Users WHERE UserId = " + userId,
                connection);
            var reader = command.ExecuteReader();

            while (reader.Read())
            {
                user.Name = reader["Name"].ToString();
                user.DateOfBirth = DateTime.Parse(reader["DateOfBirth"].ToString());
                user.Country = reader["Country"].ToString();
            }

            connection.Close();

            return user;
        }
    }
}
c# design-patterns repository-pattern
1个回答
0
投票

我怎样才能实现工作和存储库模式的单位静态类?

您可以利用,只要有人在这里调用的代码,它们通过公共入口点这样做的事实。这意味着,当呼叫方首先进入类(通过所述公用方法),可以创建一个工作单元和处理它,只有当该相同方法返回一个值给调用者(或简单地结束时)。

沿着线的东西:

public static class MyClass
{
    public static User LoadUser(int userId)
    {
        using (var uow = new UnitOfWork())
        {
            DoSomething(uow);

            var user = uow.UserRepository.GetById(userId);

            return user;
        }
    }
}

从本质上讲,每一个公共方法应该创建,使用和工作实例的一个单元的处理。这确保了两两件事:

  • 并发呼叫使用作品的各自独立的单元。
  • 工作的任何单位将永远萦绕在记忆的输入方法完成之后。

这也得到棘手,当你开始使用异步编程,但我忽略这一考虑,因为你也从未提起过。


我喜欢实现施加固体原则和单元测试应用的解决方案

当你处理依赖注入它变得稍微棘手。静态类没有注射的构造函数(注意:他们有一个构造函数,但他们不允许构造函数的参数)。

所以注入你的依赖将是...非典型的。一个解决方案,我能想到的是要明确设置内核(我在这里使用NInject为例的问题):

public static class MyClass
{
    public static IKernel Kernel { get; set; }

    public static User LoadUser(int userId)
    {
        using (var uow = Kernel.Get<IUnitOfWork>())
        {
            DoSomething(uow);

            var user = uow.UserRepository.GetById(userId);

            return user;
        }
    }
}

您如何设置内核(或者明确的设定,或直接分配给它的默认值)是由你。

没有NInject或任何类似的库,你可以使用Func<IUnitOfWork>作为工厂方法来创建按需工作单元实现依赖注入:

public static class MyClass
{
    public static Func<IUnitOfWork> CreateUnitOfWork { get; set; }

    public static User LoadUser(int userId)
    {
        using (var uow = CreateUnitOfWork())
        {
            DoSomething(uow);

            var user = uow.UserRepository.GetById(userId);

            return user;
        }
    }
}

同样,您如何设置工厂方法的内容是你,例如:

MyClass.CreateUnitOfWork = () => new UnitOfWork();
© www.soinside.com 2019 - 2024. All rights reserved.