C# 如何在构造函数外部实例化?

C# 如何在构造函数外部实例化?,c#,autofac,C#,Autofac,如何使用Autofac语法复制此代码 public static class MenuConfig { public static void Initialize() { var _menuService = DependecyFactory.GetInstance<IMenuService>(); Parameters.Menu = _menuService.Menu(); }

如何使用Autofac语法复制此代码

public static class MenuConfig
    {
        public static void Initialize()
        {
            var _menuService = DependecyFactory.GetInstance<IMenuService>(); 
            Parameters.Menu = _menuService.Menu();
        }
    }
LightInject有一个方法,允许从构造函数外部的接口进行实例化,如下所示:

var _service = DependecyFactory.GetInstance<IService>();
var\u service=DependecyFactory.GetInstance();

Autofac的等效方法是什么?

调用
containerBuilder.Build()
时,您会得到一个实现了
IContainer
ILifetimeScope
的容器,只要您掌握了其中一个接口,就可以从中解析类型:

container.Resolve<IService>();
无论如何,由于您在注释中提到了一个静态类,最好的解决方案是将其更改为非静态类,并将其注册为Autofac的singleton。然后,您可以将
Func serviceFactory
注入到该单例中,并在需要时创建/处置该服务的实例

using (var service = serviceFactory())
{
    service.Value.UseService();
}

这在Autofac中根本不可能实现。所有其他涉及Autofac的解决方案都需要代码重构,这可能会破坏软件功能。不幸的是,最优雅、破坏性最小的解决方案是:

var _service = new Service(new Dependency(new context()));

因为这是一个只处理软件一部分的边缘案例,所以这种折衷是可以接受的。不过,如果Autofac在将来的某个版本中实现了此功能,那就太好了。

可能的复制版本可能会更具体地说明您尝试执行的操作……对于构造函数之外的内容,您的意思是什么?我想你有一个构造函数吧?你正在使用的类可以注册到Autofac,对吗?这是一个边缘案例场景。我有一个静态类,在启动时需要数据库数据。我无法实例化静态类,因此需要一种从服务中获取数据的方法。使用LightInject,这很容易。我如何使用Autofac进行同样的操作?您不能将该静态类更改为非静态类并将其注册为singleton吗?如中所述,您不应该直接从根容器解析。是的,您需要知道该idd。但是,创建一个在程序期间有效的生存时间范围并不能解决这个问题,因此需要使用其他解决方案。我已经更新了我的答案。所以底线是:没有等效的Autofac命令来做LightInject所做的事情,对吗?我简要地研究了Singleton模式,但无法完全理解和实现它。我将进一步研究这一点,因为我认为这是正确的方法。LightInject方法快速简单,对于这些类型的场景非常有用。我希望我不必用Autofac重新设计原始代码。好吧,将来你会知道,避免静态类与DI结合,一个全新的世界将打开(例如,单元测试,这在静态类+LightInject中可能是不可能的)。顺便说一句,你不需要查找单例模式。我的意思只是一个非静态类,您可以使用Autofac注册
AsSingleton
(作为静态类的替代品)。
using (var service = serviceFactory())
{
    service.Value.UseService();
}
var _service = new Service(new Dependency(new context()));