2016-10-11 1 views
0

Ich versuche herauszufinden, was die richtige Methode ist, um einfache Injektion und Dependency Injection zu verwenden.Verwendung von einfachen Injektor mit Basisklassen

Ich habe MasterController und einige Controller, die darunter arbeiten. Also im Grunde, was ich versuche, eine MasterController archieve, die ich aus einer anderen Klassen oder vielleicht von meiner Benutzeroberfläche verwenden kann.

public class MasterController 
{ 
    public static Container _container = new Container(); 

    ILogger logger; 

    public IMainController MainController; 
    public ISubController SubController; 

    public MasterController() 
    { 
     _container.Register<ILogger, DebugLogger>(Lifestyle.Singleton); 
     _container.Register<IMainController, TestController>(Lifestyle.Singleton); 
     _container.Register<ISubController, Test2Controller>(Lifestyle.Transient); 

     _container.Verify(); 

     logger = _container.GetInstance<ILogger>(); 
     MainController = _container.GetInstance<IMainController>(); 
    } 

    public void RenameMainController(string _name) 
    { 
     MainController.Name = _name; 
    } 

    // more code here. 
} 

Dann habe ich meine IMainController, ISubController, TestController und Test2Controller.

public interface IMainController 
{ 
    string Name { get; set; } 
    void DoSomething(); 
} 

public interface ISubController 
{ 
    string Name { get; set; } 
    void DoSomething(); 
    void SomeExtraFunctionality(); 
} 

public class TestController : BaseController, IMainController 
{ 
    private ILogger logger; 

    public List<ISubController> SubControllers = new List<ISubController>(); 

    public TestController(ISubController _SubController, ILogger _logger) 
    { 
     logger = _logger; 

     SubControllers.Add(_SubController); 
     logger.Log("TestController ready"); 
    } 

    public void DoSomething() { } 
} 

public class Test2Controller : BaseController, ISubController 
{ 
    private ILogger logger; 

    public Test2Controller(ILogger _logger) 
    { 
     logger = _logger; 
     logger.Log("TestController ready"); 
    } 

    public void DoSomething() { } 
    public void SomeExtraFunctionality() { } 
} 

Meine Idee ist, dass ich einige Controller haben und sie verwenden einige gemeinsame Dinge von Base

public class BaseController 
{ 
    public string Name { get; set; } 

    // here is some code. 
} 

Aber in BaseController Ich möchte auch die ILogger verwenden. Wie mache ich das richtig?

Jetzt habe ich BaseController Container hinzugefügt.

_container.Register<BaseController>(Lifestyle.Transient); 

Und dann Zugabe Konstruktor Base

public BaseController(ILogger _logger) 
    { 
     logger = _logger; 
    } 

Und fügen Sie dann den

: base(_logger) 

nachdem alle Controller Konstrukteuren Beispiel:

public TestController(ISubController _SubController, ILogger _logger) : base(_logger) 

Aber ist das die richtige Wie könnte man das machen oder würde es einen "richtigen" Weg geben?

+0

Sie sollten die Dokumente lesen. Es kann überwältigend sein alle Informationen, aber es ist eine der besten Dokumentationen, die ich gelesen habe, es hat alles. –

Antwort

3

Haben Sie die Dokumentation befolgt? Using Simple Injector

Nicht einmal Ihr Master-Controller sollte sich des Containers bewusst sein und der Container sollte durch die Anwendung nicht weit zugänglich sein. Es ist besser, Ihren Container in der Composition Root Ihrer Anwendung zu erstellen und zu konfigurieren, d. H. Irgendwo in der Nähe von Application_Start gemäß der Dokumentation des Simple Injector und diesen Container nicht für den Rest Ihrer Anwendung verfügbar machen. Andernfalls enden Sie effektiv mit der Service Locator Anti Pattern. Im Rahmen der Konfiguration können Sie Simple Injector für den Lifestyle PerWebApiRequest einrichten (vorausgesetzt, Sie verwenden MVC oder wählen Sie eine geeignete Alternative) und der Container injiziert die Abhängigkeiten automatisch in einen beliebigen Controller-Konstruktor und entfernt die IDisposable Abhängigkeiten ohne Sie etwas anderes tun als die Abhängigkeit im Kompositionswurzel konfigurieren. Kein Controller wird daher jemals bemerken müssen, dass der Container tatsächlich existiert.

Verwandte Themen