mar*_*nes 3 asp.net-mvc dependency-injection ioc-container autofac
我刚刚开始使用IoC框架并且一直在使用Autofac.
在下面的示例代码中,我注册了两个完全不同的类(在global.asax中),它们都实现了相同的接口,我想知道我们如何确保Autofac使用正确的类?目前,我的一个控制器将IPhotoBlogRepository作为其构造函数,传递给PhotoBlogRepositoryOR a TestRepository,具体取决于下面代码中的first/last.
builder.RegisterType<PhotoBlogRepository>().As<IPhotoBlogRepository>();
builder.RegisterType<TestRepository>().As<IPhotoBlogRepository>();
Run Code Online (Sandbox Code Playgroud)
这是设计的.容器无法开箱即用,知道您打算使用哪种服务.如果在生产代码中只有一个接口实现,那么您的注册代码应确保注册的服务不超过一个.
如果您打算支持多个实现,那么您的控制器可能会依赖于IEnumerable<IPhotoBlogRepository>.Autofac将为控制器提供实现该接口的所有已注册服务的集合.
如果控制器需要更细粒度的控制,请查看Autofac如何支持元数据.
也就是说:从您的示例中我看到您正在注册接口的测试实现.在单元测试中,我很少从容器中解析SUT(在这种情况下是你的控制器),而是直接实例化它.这消除了用虚假服务"替换"真实服务的问题,因为您总是将它们直接交给控制器构造函数.