简单注入器:在运行时替换注册类型

时间:2017-05-25 12:05:10

标签: c# simple-injector

Simple Injector中是否有任何方法可以在运行时将一种类型的默认值替换为Structure Map中的containter.Inject()?我使用结构图借用code如下

var container = new Container(x => { x.For<IFoo>().Use<AFoo>(); });
container.GetInstance<IFoo>().ShouldBeOfType<AFoo>();
container.Configure(x => x.For<IFoo>().Use<BFoo>());

// The default of IFoo is now different
container.GetInstance<IFoo>().ShouldBeOfType<BFoo>();

// or use the Inject method that's just syntactical
// sugar for replacing the default of one type at a time
container.Inject<IFoo>(new CFoo());

container.GetInstance<IFoo>().ShouldBeOfType<CFoo>();

我的背景

注册容器

// bypass verify was removed for short
_container.Register<HttpContextBase>(() => new HttpContextWrapper(HttpContext.Current)); 
_container.Register(() => _container.GetInstance<HttpContextBase>().User.Identity);

我的服务

public class MyService : IMyService
{
    public MyService(IIdentity identity)
    {
        //...
    }
    //...
}

我的应用没有问题。有效。但是在我的单元测试中(没有模拟的真实本地数据库),我想用登录用户替换IIdentity。我使用了结构图,它起作用了。现在我不知道如何使它适用于Simple Injector。

1 个答案:

答案 0 :(得分:2)

  

但在我的单元测试中(没有模拟的真实本地数据库),我想用登录用户替换IIdentity。

您绝对可以使用不同的注册替换真正的IIdentity注册以进行单元测试。您只需在从容器中解析之前执行此操作

这意味着每个集成测试(我说'集成',因为单元测试使用DI容器)应该得到它自己的Container实例。其次,为了能够覆盖现有注册,您必须设置container.Options.AllowOverridingRegistrations。有关详细信息,请阅读this