如何在构造函数之外实例化?

时间:2018-07-24 17:19:39

标签: c# autofac

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

public static class MenuConfig
    {
        public static void Initialize()
        {
            var _menuService = DependecyFactory.GetInstance<IMenuService>(); 
            Parameters.Menu = _menuService.Menu();
        }
    }

在将其称为“重复问题”之前,请注意,我正在寻找Autofac命令。我无法在任何地方注入接口,然后调用“解决”。我需要执行的是内联且未注入的“ InstancePerRequest”,因此我不必这样做:

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

LightInject具有一种方法,该方法允许从这样的构造函数的OUTSIDE接口进行实例化:

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

Autofac的等效方法是什么?

2 个答案:

答案 0 :(得分:0)

调用containerBuilder.Build()时,您将返回一个实现IContainerILifetimeScope的容器,只要您拥有以下接口之一,就可以从中解析类型:

container.Resolve<IService>();

如果您希望此容器是静态的,则可以将该容器作为静态属性添加到ProgramStartup类中(取决于您是要创建控制台还是ASP.NET应用程序)

请记住,根容器将在应用程序的整个过程中都存在,因此,如果使用不当,可能会导致不必要的内存泄漏。另请参见documentation中的警告。

不过,完全可以通过在界面中解析Owned<>版本来自己进行内存管理:

using (var service = Program.Container.Resolve<Owned<IService>>())
{
    service.Value.UseService();
}

无论如何,由于您在注释中提到了静态类,所以最好的解决方案是将其更改为非静态类,并通过Autofac将其注册为单例。然后,您可以将Func<Owned<IService>> serviceFactory注入该单例中,并在需要的地方创建/处理该服务的实例。

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

答案 1 :(得分:0)

Autofac根本无法做到这一点。所有其他涉及Autofac的解决方案都需要代码重构,这可能会破坏软件功能。因此,不幸的是,最优雅,破坏性最小的解决方案是这样的:

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

由于这是仅解决软件一部分问题的一种极端情况,因此可以接受这种折衷方案。但是,如果Autofac在将来的版本中实现了此功能,那就太好了。