如何使用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的等效方法是什么?
答案 0 :(得分:0)
调用containerBuilder.Build()
时,您将返回一个实现IContainer
和ILifetimeScope
的容器,只要您拥有以下接口之一,就可以从中解析类型:
container.Resolve<IService>();
如果您希望此容器是静态的,则可以将该容器作为静态属性添加到Program
或Startup
类中(取决于您是要创建控制台还是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在将来的版本中实现了此功能,那就太好了。