如何解决不同控制器中的不同服务?

时间:2016-07-06 10:13:02

标签: c# asp.net-core-mvc

我有两个MVC控制器。

两个控制器都依赖于IFileContainer接口。

在一个控制器中,我想要解析FsFileContainer,在第二个控制器中,我想解决FtpFileContainer

寄存器:

    serviceCollection.AddTransient<IFileContainer, FsFileContainer>();
    serviceCollection.AddTransient<IFileContainer, FtpFileContainer>();

在这种情况下如何解决容器?

1 个答案:

答案 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>();