Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将装饰图案与unity容器一起使用(针对单例)_C#_Dependency Injection_Unity Container - Fatal编程技术网

C# 将装饰图案与unity容器一起使用(针对单例)

C# 将装饰图案与unity容器一起使用(针对单例),c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,我有两个接口,一个从另一个继承。 对于基本接口,我有一个单例实现,对于子接口,我有一个装饰器单例实现(装饰基本实现) 现在,如果基接口被注入(或解析)到其他客户机中,则它们得到的是基实现,而不是decorator(如果依赖于子接口,它们只得到decorator) 我想要的是,应该将decorator实现注入到每个客户机中,但是仍然需要构造基本实现并将其注入decorator单例中 我该如何设置 using System; using Microsoft.Practices.Unity; pub

我有两个接口,一个从另一个继承。 对于基本接口,我有一个单例实现,对于子接口,我有一个装饰器单例实现(装饰基本实现)

现在,如果基接口被注入(或解析)到其他客户机中,则它们得到的是基实现,而不是decorator(如果依赖于子接口,它们只得到decorator)

我想要的是,应该将decorator实现注入到每个客户机中,但是仍然需要构造基本实现并将其注入decorator单例中

我该如何设置

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>(); 
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var container=new UnityContainer();
container.RegisterType(
新的ContainerControlled LifetimeManager());
container.RegisterType(
新的ContainerControlled LifetimeManager());
//想在这里获得Tracker singleton实例吗
var provider=container.Resolve();
//想在这里获得Tracker singleton实例吗
var tracker=container.Resolve();
}
}

我不是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>();
var container=newunitycontainer();
container.RegisterType();
container.RegisterType(“提供者”);
container.RegisterType
(
新建ContainerControlled LifetimeManager(),
新注入构造函数(
新的ResolvedParameter(“提供程序”)
));
container.RegisterType
(
新建ContainerControlled LifetimeManager(),
新注入构造函数(
新的ResolvedParameter(“提供程序”)
));
var p=container.Resolve()作为ITracker;
var t=container.Resolve();

是否希望ITracker的所有实例都具有相同的IProvider实例?只有一个provider实例和一个tracker实例(都注册为Singleton)。tracker将获取作为依赖项的提供程序。但是,客户机应该获得跟踪程序单例,无论它们是依赖于IProvider还是iTrackers,所以您只希望将IProvider注入跟踪程序实现中。如果IProvider依赖于任何其他类,那么它应该获得ITracker?@Scrobi:没错。decorator是应该获得提供程序的唯一组件,所有其他组件都应该获得decorator。问题是,这个解决方案我必须自己创建提供程序实例,但我希望容器为我创建它(因为在实际系统中,提供程序还将具有其他依赖项)为了使上述方法有效,您必须在创建provider实例之前建立依赖关系。您可以注册映射的名称,然后在将参数注入构造函数时使用该名称。