Unity - 使用已解析的类型作为其他已解析类型的参数

Unity - use resolved Types as parameters in other resolved types

我花了 8 个小时才开始统一,并且已经弄明白了一些事情,但我无法找到一个角度来解决这个问题。我得到了 IResourceManager

public interface IResourceManager
{
    ILogger Logger { get; set; }
    string Path { get; set; }
}

以及对应的类型:

public class ResourceManager : IResourceManager
{
    public ResourceManager(ILogger logger, string path)
    {
        Logger = logger;
        Path = path;
    }
    public ILogger Logger { get; set; }
    public string Path { get; set; }
}

此外

public class Logger : ILogger
{    }

最后

public ResourceManagerController(ILogger logger, IResourceManager imageResourceManager)
{}

我想让 Logger 和 ResourceManager 像单例一样运行。只要 IResourceManager 中没有 ILogger,我就可以使用它,但我一直收到 "no default constructor" 异常。

到目前为止我有:

public static void Register(HttpConfiguration config)
{
    var container = new UnityContainer();

    container.RegisterType<ILogger, Logger>("DefaultLogger", new ContainerControlledLifetimeManager());

    container.RegisterType<IResourceManager, ResourceManager>("imageResourceManager", new ContainerControlledLifetimeManager(),
        new InjectionConstructor(new ResolvedParameter<ILogger>("DefaultLogger"), "basePath"));

    config.DependencyResolver = new UnityResolver(container);

    // Web API routes ...
}

我如何必须注册我的类型,以便 ResourceManagerController 的实例化成功并且 LoggerResourceManager 都用作单例?

如果你想注册一个记录器作为默认使用,你不能命名注册。 如果你想要所有命名注册,让unity注入一个数组。

要么……

container.RegisterType<ILogger, Logger>(new ContainerControlledLifetimeManager());
container.RegisterType<IResourceManager, ResourceManager>(new ContainerControlledLifetimeManager(), new InjectionConstructor(new ResolvedParameter<ILogger>(), "basePath"));

public ResourceManagerController(ILogger logger, IResourceManager imageResourceManager)
{}

或...

container.RegisterType<ILogger, Logger>(new ContainerControlledLifetimeManager());
container.RegisterType<IResourceManager, ResourceManager>("imageResourceManager", new ContainerControlledLifetimeManager(), new InjectionConstructor(new ResolvedParameter<ILogger>(), "basePath"));

public ResourceManagerController(ILogger logger, IResourceManager[] allResourceManagers)
{}