【发布时间】:2016-12-12 22:52:58
【问题描述】:
我是 Autofac 的新用户。
我有一个工厂需要根据工厂方法的输入创建不同的类,但只有一个需要创建的类有其他依赖项。
我找到了这个答案: Autofac Binding at Runtime
谁的解决方案效果很好。
但后来我开始阅读有关 Autofac 的委托工厂 (http://docs.autofac.org/en/latest/advanced/delegate-factories.html)... 现在我很困惑。
看来,如果您使用委托工厂,那么您实际上根本不需要编写工厂类?
这是我当前工厂类的片段:
public class ExternalUserInformationProviderFactory : IExternalUserInformationProviderFactory
{
private readonly IComponentContext autofacContainer;
public ExternalUserInformationProviderFactory(IComponentContext autofacContainer)
{
this.autofacContainer = autofacContainer;
}
public IProvideExternalUserInformation GetExternalUserInformationProvider(string loginProvider)
{
switch (loginProvider)
{
case "Google":
return autofacContainer.Resolve<GoogleExternalUserInformationProvider>();
case "Twitter":
return autofacContainer.Resolve<TwitterExternalUserInformationProvider>();
}
return null;
}
}
在此示例中,TwitterExternalUserInformationProvider 在其构造函数中采用了依赖项:
public class TwitterExternalUserInformationProvider : IProvideExternalUserInformation
{
private readonly ITwitterRepository twitterRepository;
public TwitterExternalUserInformationProvider(ITwitterRepository twitterRepository)
{
this.twitterRepository = twitterRepository;
}
}
而且 GoogleExternalUserInformationProvider 根本不需要构造函数参数。
这是我在 Startup.cs 中连接这个工厂的方式(我使用的是 asp.net core):
var containerBuilder = new ContainerBuilder();
containerBuilder.Register<IExternalUserInformationProviderFactory>(c => new ExternalUserInformationProviderFactory(c.Resolve<IComponentContext>()));
containerBuilder.RegisterType<TwitterExternalUserInformationProvider>();
containerBuilder.RegisterType<GoogleExternalUserInformationProvider>();
Autofac 足够聪明,可以为我解决 ITwitterRepository 依赖项,这真的很酷。
基于当前的实现,我是否可以使用委托工厂并完全摆脱 ExternalUserInformationProviderFactory?
我很好奇。
谢谢
【问题讨论】:
标签: dependency-injection delegates autofac factory