我想知道注册容器本身是否有任何副作用
IContainer container; ContainerBuilder builder = new ContainerBuilder(); container = builder.Build(); builder.RegisterInstance(container).As<IContainer>();
并使用它像这样
builder.RegisterType<IManagmentServiceImp>().As<ManagmentServiceImp>() .WithParameter(new ResolvedParameter( (pi,ctx) => pi.ParameterType == typeof(IContainer) && pi.Name == "Container",(pi,ctx) => container ));
或者它是否会起作用.
解决方法
您的代码不安全,因为您在初始化之前注册了一个实例.
如果您需要访问组件内的容器(这不是一个好主意),您可以依赖具有Resolve方法的ILifetimeScope.
public class ManagmentServiceImp { public ManagmentServiceImp(ILifetimeScope scope) { } }
ILifetimeScope在Autofac中自动注册,您无需为其添加注册.
有关详细信息,请参阅Autofac文档中的Controlling Scope and Lifetime.
顺便说一句,依赖IoC容器并不是一个好习惯.看起来你使用Service Locator反模式.如果您需要容器延迟加载依赖项,则可以使用Func< T>组合.或懒惰< T>
public class ManagmentServiceImp { public ManagmentServiceImp(Lazy<MyService> myService) { this._myService = myService; } private readonly Lazy<MyService> _myService; }
在这种情况下,首次访问时将创建MyService.
有关详细信息,请参阅Autofac文档中的Implicit Relationship.