【发布时间】:2017-12-04 00:41:22
【问题描述】:
上下文
我知道 SimpleInjector 的 LifestyleMismatch 异常的目的以及它抛出它的原因。但假设有:
Players.dll
public abstract class PlayerEqualizer { ... }
public abstract class Player : IPlayer, ISongAware
{
public Player(PlayerEqualizer eq)
{
Equalizer = eq;
}
public PlayerEqualizer Equalizer { get; }
public abstract void StartPlay();
}
Players.Rock.dll
public class RockPlayerEqualizer : PlayerEqualizer {}
public class RockPlayer : Player
{
public RockPlayer(RockPlayerEqualizer eq) : base(eq) {}
public override void StartPlay() { ... }
}
public class RnBPlayer : Player
{
public RnBPlayer(RockPlayerEqualizer eq) : base(eq) {}
public override void StartPlay() { ... }
}
Players.Pop.dll
public class PopPlayerEqualizer : PlayerEqualizer{}
public class PopPlayer : Player
{
public PopPlayer(PopPlayerEqualizer eq) : base(eq) {}
public override void StartPlay() { ... }
}
Player 的所有实现都注册为IPlayer 的集合,并且所有注册都是单例的:
var registrations = container
.GetTypesToRegister(typeof(IPlayer), assemblies)
.Select(t => Lifestyle.Singleton.CreateRegistration(t, container));
foreach (var registration in registrations)
{
container.AddRegistration(registration.ImplementationType, registration);
}
container.RegisterCollection<IPlayer>(registrations);
container.RegisterCollection<ISongAware>(container.GetCurrentRegistrations()
.Where(ip => typeof(ISongAware).IsAssignableFrom(ip.ServiceType))
.Select(ip => ip.Registration));
问题
全部
-
container.GetInstance<RockPlayer> container.GetAllInstances<IPlayer>container.GetAllInstances<ISongAware>
必须返回相同的实例,因此IPlayer 注册必须是单例的。这样做,所有 PlayerEqualizer 也必须是单例的,因为它们是单例注册的依赖项,但 PlayerEqualizer 实现不是单例(RockPlayer 和 RnBPlayer 都依赖于 RockPlayerEqualizer 但它们需要不同的实例)。
我尝试了什么
我能找到的唯一解决方案是将 SimpleInjector container.Options.SuppressLifestyleMismatchVerification 标志设置为 False 但我不想失去该功能...另一个选项可以在 IPlayer 上调用 SuppressDiagnosticWarning 方法的注册,但尽管我无法让它工作,但我真正担心的是这些解决方案只是解决方法......
我错过了什么吗?
【问题讨论】:
-
这些容器方法必须总是返回相同的实例吗? (这听起来像x-y problem,因为所有后果都来自该限制。)
标签: c# wpf inversion-of-control simple-injector