将装饰器模式与 Unity 容器一起使用(适用于单例)



我有 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>();

最新更新