我有两个MVC控制器。
两个控制器都依赖于IFileContainer
接口。
在一个控制器中,我想要解析FsFileContainer
,在第二个控制器中,我想解决FtpFileContainer
。
寄存器:
serviceCollection.AddTransient<IFileContainer, FsFileContainer>();
serviceCollection.AddTransient<IFileContainer, FtpFileContainer>();
在这种情况下如何解决容器?
答案 0 :(得分:2)
最简单的方法是使用工厂,因为ASP.NET Core IoC Container不支持命名依赖项或使用支持它的第三方IoC容器。
public class FileContainerFactory : IFileContainerFactory
{
private readonly IServiceProvider provider;
public class FileContainerFactory(IServiceProvider provider)
{
this.provider = provider;
}
public IFileContainer CreateFileSystemContainer()
{
// resolve it via built in IoC
return provider.GetService<FsFileContainer>();
}
public IFileContainer CreateFtpContainer()
{
// resolve it via built in IoC
return provider.GetService<FtpFileContainer>();
}
}
然后将IFileContainerFactory
注入您的控制器。
另一种方法是使用标记接口标记接口并注册/注入这些
// It defines no new methods or properties, just inherits it and acts as marker
public interface IFsFileContainer : IFileContainer {}
public interface IFtpFileContainer : IFileContainer {}
public class FsFileContainer : IFsFileContainer
{
...
}
在Startup.cs
中services.AddTransient<IFsFileContainer, IFileContainer>();
services.AddTransient<IFtpFileContainer, IFileContainer>();