分配给我的任务是重构代码,但不应修改类的静态访问修饰符。我正在尝试实现服务层,工作单元,存储库模式。静态存储库代码在下面,如何为静态类实现工作单元和存储库模式?我喜欢采用坚实的原则和可单元测试的应用程序来实施解决方案。
静态类
var searchInput = document.querySelector(".search-container-inner input");
if (document.querySelector(".overlay.style-light-bg")) { // check if exists
searchInput.style.display = "none";
} else {
searchInput.style.display = "block";
}
答案 0 :(得分: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();