静态类的工作单元存储库模式

时间:2019-02-06 12:32:32

标签: c# design-patterns repository-pattern

分配给我的任务是重构代码,但不应修改类的静态访问修饰符。我正在尝试实现服务层,工作单元,存储库模式。静态存储库代码在下面,如何为静态类实现工作单元和存储库模式?我喜欢采用坚实的原则和可单元测试的应用程序来实施解决方案。

静态类

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";
}

1 个答案:

答案 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();