c# – 使用Autofac注册容器本身

前端之家收集整理的这篇文章主要介绍了c# – 使用Autofac注册容器本身前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道注册容器本身是否有任何副作用
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.

原文链接:https://www.f2er.com/csharp/98134.html

猜你在找的C#相关文章