gpt4 book ai didi

c# - Ninject 内核绑定(bind)覆盖

转载 作者:太空狗 更新时间:2023-10-29 22:29:23 29 4
gpt4 key购买 nike

我只是想知道在内核中重新绑定(bind)绑定(bind)的最佳做法是什么。

我有一个带有内核的类和一个带有默认生产绑定(bind)的私有(private)类模块。

对于测试,我想覆盖这些绑定(bind),以便我可以交换我的测试替身/模拟对象。

MyClass.Kernel.Load(new InlineModule(m=> m.Bind<IDepend>().To<TestDoubleDepend>()))

覆盖 IDepend 的任何现有绑定(bind)?

最佳答案

我尝试尽可能少地在我的代码中直接使用 DI 内核,而不是依赖构造函数注入(inject)(或在某些情况下使用属性,例如 Attribute 类)。但是,我必须在必须使用抽象层的地方使用抽象层,以便我可以设置 DI 内核对象,使其在单元测试中可模拟。

例如:

public interface IDependencyResolver : IDisposable
{
T GetImplementationOf<T>();
}

public static class DependencyResolver
{
private static IDependencyResolver s_resolver;

public static T GetImplementationOf<T>()
{
return s_resolver.GetImplementationOf<T>();
}

public static void RegisterResolver( IDependencyResolver resolver )
{
s_resolver = resolver;
}

public static void DisposeResolver()
{
s_resolver.Dispose();
}
}

使用这样的模式,您可以从单元测试中设置 IDependencyResolver,方法是调用 RegisterResolver 并使用模拟或伪造的实现来返回您想要的任何对象,而无需连接完整的模块。如果您将来选择切换到另一个 IoC 容器,它还有一个从特定 IoC 容器中抽象代码的第二个好处。

当然,您还希望根据需要向 IDependencyResolver 添加其他方法,我只是将基本知识作为示例包含在这里。是的,这将需要您围绕 Ninject 内核编写一个 super 简单的包装器,它也实现了 IDependencyResolver

你想要这样做的原因是你的单元测试实际上应该只测试一件事并且通过使用你的实际 IoC 容器,你实际上比被测试的一个类要多,这可能会导致误报使您的测试变得脆弱,并且(更重要的是)随着时间的推移动摇开发人员对其准确性的信心。这可能导致测试冷漠和放弃,因为测试有可能失败但软件仍能正常工作(“别担心,那个总是失败,这没什么大不了的”)。

关于c# - Ninject 内核绑定(bind)覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1261357/

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