【问题标题】:C# Autofac New InstanceC# Autofac 新实例
【发布时间】:2021-01-11 21:38:06
【问题描述】:

我有一个类“DependencyResolver”,我在其中手动返回对象的实例。在那里我使用了“Activator.CreateInstance”。 我想改变它,让它使用 autofac。

我的“获取”函数运行良好:

      public T Get<T>()
        {
            return _container.Resolve<T>();
        }

但我还有一个函数“CreateNew”,我需要一个新实例:

      public T CreateNew<T>()
        {
            return _container.Resolve<T>();
        }

问题是我总是得到相同的实例。 我的注册如下所示:

            var builder = new ContainerBuilder();
            foreach (var dllFileName in DependencyMapping.GetAllDllFilenames())
            {
                builder
                    .RegisterAssemblyTypes(Assembly.LoadFile(Path.Combine(GetPathFromInstalledSys(), dllFileName)))
                    .AsImplementedInterfaces()
                    .SingleInstance();
            }
            _container = builder.Build();

所以有一个地方我可以控制行为:“SingleInstance”或“Ins​​tancePerDependency”。但我不知道用户是否需要一个新实例。调用“CreateNew”时有什么方法可以改变行为吗?

【问题讨论】:

    标签: c# .net singleton autofac


    【解决方案1】:

    生命周期范围(单个实例,每个依赖项的实例)在注册时控制,而不是在解析时控制。没有办法改变它。所有 DI 容器都是这种情况,而不仅仅是 Autofac。部分原因是消费者不应该知道他们想要什么范围 - 他们只是要求一个东西并得到它。

    消费者通常也不应该处理垃圾 - 东西会被容器处理掉。

    请注意,您在这里拥有的是服务位置(客户端向容器询问某件事),而不是依赖注入(客户端在构造函数中获取依赖项并且不知道容器)。虽然有时需要服务位置,但一般尽量避免;这并不比在代码中调用new 好多少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多