2017-09-01 3 views
0

Ich bin 8 Stunden in Einheit und habe schon einige Dinge herausgefunden, aber ich finde keinen Winkel damit. Ich habe eine IResourceManagerUnity - verwende aufgelöste Typen als Parameter in anderen aufgelösten Typen

public interface IResourceManager 
{ 
    ILogger Logger { get; set; } 
    string Path { get; set; } 
} 

und den entsprechenden Typ:

public class ResourceManager : IResourceManager 
{ 
    public ResourceManager(ILogger logger, string path) 
    { 
     Logger = logger; 
     Path = path; 
    } 
    public ILogger Logger { get; set; } 
    public string Path { get; set; } 
} 

Futhermore

public class Logger : ILogger 
{ } 

und schließlich

public ResourceManagerController(ILogger logger, IResourceManager imageResourceManager) 
{} 

Ich möchte den Logger und ResourceMa verhalten nager wie Singletons. Ich habe es funktioniert, solange es keinen ILogger in IResourceManager gab, aber ich bekomme immer die Ausnahme "kein Standardkonstruktor".

Bisher habe ich:

public static void Register(HttpConfiguration config) 
{ 
    var container = new UnityContainer(); 

    container.RegisterType<ILogger, Logger>("DefaultLogger", new ContainerControlledLifetimeManager()); 

    container.RegisterType<IResourceManager, ResourceManager>("imageResourceManager", new ContainerControlledLifetimeManager(), 
     new InjectionConstructor(new ResolvedParameter<ILogger>("DefaultLogger"), "basePath")); 

    config.DependencyResolver = new UnityResolver(container); 

    // Web API routes ... 
} 

Wie muss ich meine Art zu registrieren, so dass der Instanziierung ResourceManagerController ist erfolgreich und beide Logger und ResourceManager als Singletons verwendet werden?

Antwort

0

Wenn Sie einen Logger zur Verwendung als Standard registrieren möchten, dürfen Sie die Registrierung nicht benennen. Wenn Sie alle benannten Registrierungen wollen, lassen Sie unity ein Array injizieren.

Entweder ...

container.RegisterType<ILogger, Logger>(new ContainerControlledLifetimeManager()); 
container.RegisterType<IResourceManager, ResourceManager>(new ContainerControlledLifetimeManager(), new InjectionConstructor(new ResolvedParameter<ILogger>(), "basePath")); 

und

public ResourceManagerController(ILogger logger, IResourceManager imageResourceManager) 
{} 

oder ...

container.RegisterType<ILogger, Logger>(new ContainerControlledLifetimeManager()); 
container.RegisterType<IResourceManager, ResourceManager>("imageResourceManager", new ContainerControlledLifetimeManager(), new InjectionConstructor(new ResolvedParameter<ILogger>(), "basePath")); 

und

public ResourceManagerController(ILogger logger, IResourceManager[] allResourceManagers) 
{} 
Verwandte Themen