gpt4 book ai didi

asp.net-mvc - 带有存储库的静态实用程序类的依赖性问题(.NET MVC 项目)

转载 作者:行者123 更新时间:2023-11-28 21:13:48 30 4
gpt4 key购买 nike

我有一个带有标准 IoC 设置的 MVC 项目,该项目使用 StructureMap 将存储库注入(inject) Controller 构造函数。

我还决定我想要一个静态的“实用程序”类,我可以在其中拥有可以被不同 Controller 调用的通用方法。例如,我有:

public static IEnumerable<CountryCode> GetCountryList()
{
ICountryCodeRepository repo = ObjectFactory.GetInstance<ICountryCodeRepository>();
IEnumerable<CountryCode> countries = repo.GetAll();
return countries;
}

如您所见,这直接从 ObjectFactory 创建了一个 repo 对象。现在的问题是,当我想对我的 Controller 进行单元测试时,我可以模拟 Controller 的 repo 协议(protocol),但不能模拟实用程序类( Controller 最终调用)中的 repo 协议(protocol)我敢肯定还有其他原因我的实用程序类是错误的,但这是我目前所看到的。我也读过一些 stuff说我有的是bad design ,我只是不知道如何修复它。

我正在考虑使用 GetCountryList() 函数来接受 repo 对象

GetCountryList(ICountryCodeRepository _repo)

并且调用 Controller 会将其传递进来,但这是否只是创建了另一个依赖关系问题,因为所有 Controller 都必须知道实用程序函数需要什么?

或者是否有可能以某种方式使用 StructureMap 来注入(inject)这些实用方法?

最佳答案

至少您知道自己所做的是糟糕的设计,这没关系。这很好,阅读这篇文章的人也会知道这一点,并避免犯与您相同的错误。

但现在,您可以在静态类中使用提供程序:

public static class Foo
{
public static Func<ICountryCodeRepository> CountryRepoProvider =
() => ObjectFactory.GetInstance<ICountryCodeRepository>();

public static IEnumerable<CountryCode> GetCountryList()
{
return CountryRepoProvider().GetAll();
}
}

现在在你的单元测试中你可以模拟它:

Foo.CountryRepoProvider = () => mocha; 

或者如果您使用的是 ASP.NET MVC 3 并且您的 DI 框架使用 dependency resolver您至少可以通过使其与 DI 框架无关来改进此代码:

public static IEnumerable<CountryCode> GetCountryList()
{
var repo = DependencyResolver.Current.GetService<ICountryCodeRepository>();
return repo.GetAll();
}

现在在您的单元测试中,您当然可以编写一个自定义依赖项解析器,它将吐出您的服务的模拟实例。

现在,当您查看这段代码时,您可能真的会对自己说:我在做什么我正在编写一个静态类,其中一个线性方法委托(delegate)给我从 DI 获取的存储库。当我可以从我的 DI 框架中获益,在我需要的任何地方直接注入(inject)这个存储库的实例,然后简单地调用我需要的方法时,有什么意义呢?我在那些一个线性静态方法中进行什么单元测试?我为什么要浪费时间

当然,如果您有更复杂的逻辑要处理,您只需编写一个服务层,它将必要的存储库作为构造函数依赖项,并对它们执行复杂的业务操作。然后你将简单地配置你的 DI 框架,以在你的 Controller 或任何你需要的地方注入(inject)那些准备好使用的服务实例。看?不需要任何静态类。弱耦合和单元测试友好的代码。

关于asp.net-mvc - 带有存储库的静态实用程序类的依赖性问题(.NET MVC 项目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11246814/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com