gpt4 book ai didi

c# - autofac 中的工厂模式

转载 作者:行者123 更新时间:2023-11-30 16:42:04 25 4
gpt4 key购买 nike

我想在 Autofac 中实现工厂模式。这是在 Ninject 中完成的:

Bind<ICarFilter>().To<CarFilter >();
Bind<IBikeFilter>().To<BikeFilter>();
Bind<IFilterFacade>().ToFactory().InSingletonScope();

这是 IFilterFacade 的定义

public interface IFilterFacade
{
ICarFilter CreateCarFilter();

IBikeFIlter CreateBikeFilter();
}

如果我想要一个 CarFilter 类型的实例,我需要做的就是:

public class HomeController(IFilterFacade filterFacade)
{
FilterFacade = filterFacade;
}

public IFilterFacade FilterFacade { get;set; }

public ActionResult Index()
{
var bikeFilter = FilterFacade.CreateBikeFilter();
}

关于如何在 AutoFac 中执行此操作的任何示例。我检查了 AutoFac 文档,但找不到答案或示例。

最佳答案

Autofac 中没有 ToFactory 的等效项,但您可以轻松实现通用工厂等效项。

public interface IFilterFactory
{
TFilter Get() where TFilter : IFilter;
}

public class FilterFactory : IFilterFactory
{

public FilterFactory(ILifetimeScope scope)
{
this._scope = scope;
}

private readonly ILifetimeScope _scope;

public TFilter Get<TFilter>()
{
return this._scope.Resolve<TFilter>();
}
}

然后像这样注册它:

builder.RegisterType<FilterFactory>().As<IFilterFactory>(); 
builder.RegisterType<BikeFilter>().As<IBikeFilter>();
builder.RegisterType<CarFilter>().As<ICarFilter>();

并以这种方式使用它

public class HomeController
{
private readonly IFilterFactory _filters;

public HomeController(IFilterFactory filters)
{
this._filters = filters;
}

public ActionResult Index()
{
var bikeFilter = this._filters.Get<IBikeFilter>();
// ...
}
}

我将 Create 方法重命名为 Get,因为该方法将在生命周期范围内查找一个实例,并仅在需要时创建一个实例。

另一种可能的解决方案是使用 Named and Keyed Service和内置的 IIndex 类型。

builder.RegisterType<BikeFilter>().Named<IFilter>("Bike"); 
builder.RegisterType<CarFilter>().Named<IFilter>("Car");

然后在你的 Controller 上

public class HomeController
{
private readonly IIndex<String, IFilter> _filters;

public HomeController(IIndex<String, IFilter> filters)
{
this._filters = filters;
}

public ActionResult Index()
{
var bikeFilter = this._filters["Bike"];
// ...
}
}

关于c# - autofac 中的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47356265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com