我有 2 个接口,一个继承自另一个。对于基本接口,我有一个单例实现,对于子接口,我有一个装饰器单例实现(装饰基本实现(
现在,如果将基本接口注入(或解析(到其他客户端中,它们将获得基本实现,而不是装饰器(它们只有在依赖于子接口时才获得装饰器(
我想要的是,装饰器实现应该注入到每个客户端中,但基本实现仍然需要构造并注入到装饰器单例中。
我该如何设置?
using System;
using Microsoft.Practices.Unity;
public interface IProvider
{
int GetValue();
}
public interface ITracker : IProvider
{
}
public class Provider : IProvider
{
public int GetValue()
{
Console.WriteLine("provider");
return 0;
}
}
跟踪器:
public class Tracker : ITracker
{
private readonly IProvider provider;
public Tracker(IProvider provider)
{
this.provider = provider;
}
public int GetValue()
{
Console.WriteLine("tracker");
return provider.GetValue();
}
}
程序:
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
container.RegisterType<IProvider, Provider>(
new ContainerControlledLifetimeManager());
container.RegisterType<ITracker, Tracker>(
new ContainerControlledLifetimeManager());
// want to get Tracker singleton instance here
var provider = container.Resolve<IProvider>();
// want to get Tracker singleton instance here
var tracker = container.Resolve<ITracker>();
}
}
我不是 Unity 方面的专家,但这就是我所关心的:
由于跟踪器是一个单例,因此您可以将 IProvider 作为构造函数参数传入。然后,您将IProvider和ITracker设置为解析为Tracker的实例。虽然我仍然不得不将IProvder投射到ITracker。
var container = new UnityContainer();
container.RegisterType<IDependency, Dependency>();
container.RegisterType<IProvider, Provider>("Provider");
container.RegisterType<ITracker, Tracker>
(
new ContainerControlledLifetimeManager(),
new InjectionConstructor(
new ResolvedParameter<IProvider>("Provider")
));
container.RegisterType<IProvider, Tracker>
(
new ContainerControlledLifetimeManager(),
new InjectionConstructor(
new ResolvedParameter<IProvider>("Provider")
));
var p = container.Resolve<IProvider>() as ITracker;
var t = container.Resolve<ITracker>();