Ho giocato con il contenitore Unity e ho notato uno strano comportamento. Ho una classe, che implementa più di un'interfaccia. Voglio che questa classe sia usata in posti diversi attraverso un'applicazione con vite diverse. Quindi ho mappato IFooDerived1 a Foo come Singleton e IFooDerived2 a Foo come Transient. Ma qualsiasi registrazione di Foo corrompe precedenti registrazioni di Foo.Unity RegisterType con LifetimeManager comportamento strano
Esempio:
interface IFoo { }
interface IFooDerived1 { }
interface IFooDerived2 { }
class Foo : IFoo, IFooDerived1, IFooDerived2 { }
static void Main(string[] args)
{
var container = new UnityContainer();
container.RegisterType(typeof(IFoo), typeof(Foo), new ExternallyControlledLifetimeManager());
container.RegisterType(typeof(IFooDerived1), typeof(Foo), new ContainerControlledLifetimeManager());
container.RegisterType(typeof(IFooDerived2), typeof(Foo), new TransientLifetimeManager());
foreach(var r in container.Registrations)
{
Console.WriteLine("{0} -> {1} : {2}", r.RegisteredType.Name, r.MappedToType.Name, r.LifetimeManagerType.Name);
}
}
uscita:
IFoo -> Foo : TransientLifetimeManager
IFooDerived1 -> Foo : TransientLifetimeManager
IFooDerived2 -> Foo : TransientLifetimeManager
È questo il comportamento corretto? Qualcuno può dare qualche spiegazione logica? Posso facilmente usare un altro approccio, voglio solo capire perché questo accada. Grazie.
Oltre a questo preoccupante comportamento di Unity, potresti anche voler dare un'occhiata al tuo progetto, perché penso che dovresti estrarre il comportamento che "IFooDerived2" ti dà in un'implementazione diversa. Quella nuova implementazione 'FooDerived2' può dipendere da' IFoo'. – Steven
Sì, hai ragione, il design non è molto buono. Ho già rielaborato il codice "reale". – boades
Ma sono d'accordo con te, questo è un comportamento 'interessante'. – Steven