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 的实例化成功并且 Logger
和 ResourceManager
都用作单例?
如果你想注册一个记录器作为默认使用,你不能命名注册。
如果你想要所有命名注册,让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)
{}
我花了 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 的实例化成功并且 Logger
和 ResourceManager
都用作单例?
如果你想注册一个记录器作为默认使用,你不能命名注册。 如果你想要所有命名注册,让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)
{}