分配给我的任务是重构代码,但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;
}
}
}
我怎样才能实现工作和存储库模式的单位静态类?
您可以利用,只要有人在这里调用的代码,它们通过公共入口点这样做的事实。这意味着,当呼叫方首先进入类(通过所述公用方法),可以创建一个工作单元和处理它,只有当该相同方法返回一个值给调用者(或简单地结束时)。
沿着线的东西:
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();