C# 将装饰图案与unity容器一起使用(针对单例)
我有两个接口,一个从另一个继承。 对于基本接口,我有一个单例实现,对于子接口,我有一个装饰器单例实现(装饰基本实现) 现在,如果基接口被注入(或解析)到其他客户机中,则它们得到的是基实现,而不是decorator(如果依赖于子接口,它们只得到decorator) 我想要的是,应该将decorator实现注入到每个客户机中,但是仍然需要构造基本实现并将其注入decorator单例中 我该如何设置C# 将装饰图案与unity容器一起使用(针对单例),c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,我有两个接口,一个从另一个继承。 对于基本接口,我有一个单例实现,对于子接口,我有一个装饰器单例实现(装饰基本实现) 现在,如果基接口被注入(或解析)到其他客户机中,则它们得到的是基实现,而不是decorator(如果依赖于子接口,它们只得到decorator) 我想要的是,应该将decorator实现注入到每个客户机中,但是仍然需要构造基本实现并将其注入decorator单例中 我该如何设置 using System; using Microsoft.Practices.Unity; pub
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实例之前建立依赖关系。您可以注册映射的名称,然后在将参数注入构造函数时使用该名称。