Best practice Objekterzeugung C#
In diesem Artikel geht es um die aus meiner Sicht beste Methode um ein Objekt mit Dependency Injection zu erzeugen.
Dependency Injection
Debendency Injection wird in unserem Beispiel verwendet, damit wir die Klasse für die Datenbankanbindung austauschbar machen können. Dies bezieht sich hier auf den Parameter connector.
In den folgenden Beispielen sieht man ein Objekt, welches beim Starten eine Methode eines Properties aufrufen soll.
Normale Variante
So würde das Objekt aussehen, wenn wir wie normal alles über den Konstruktor regeln würden:
- public class DataHandler
- {
- private IDatabaseConnector _connector;
- private string _connectionName;
- private string _connectionComment;
- public DataHandler(IDatabaseConnector connector, string connectionName, string connectionComment)
- {
- this._connector = connector;
- this._connectionName = connectionName;
- this._connectionComment = connectionComment;
- this._connector.Start();
- }
- }
Im oben gezeigten Beispiel wird der "connector" über Debendency Injection eingefügt. Die beiden Strings müssten als Parameter übergeben werden.
Das "Problem" bei den beiden weiteren Parametern ist, dass diese nicht ganz so einfach im IOC Container ausgelesen werden können, da diese für jedes erzeugte Objekt unterschiedlich sind.
Überarbeitetet Variante
In dieser Überarbeiteten Variante arbeite ich mit einer etwas anders aufgebauten Klasse:
- public class DataHandler
- {
- private IDatabaseConnector _connector;
- private string _connectionName;
- private string _connectionComment;
- private bool _isInitialized = false;
- public DataHandler(IDatabaseConnector connector)
- {
- this._connector = connector;
- }
- public bool Initialize(string connectionName, string connectionComment)
- {
- this._connectionName = connectionName;
- this._connectionComment = connectionComment;
- this._isInitialized = true;
- return true;
- }
- public bool Start()
- {
- if (this._isInitialized)
- {
- this._connector.Start();
- }
- return this._isInitialized;
- }
- }
Wie man sieht, habe ich nun nur noch en Parameter im Konstruktor, welcher vom IOC Container über Dependency Injection eingefügt werden kann. Die restlichen beiden Parameter muss man nun über die Initialize Methode einfügen.
Wenn der Vorgang gestartet werden soll, muss man nun die Start() Methode vom Objekt aufrufen. Diese wird nur ausgeführt, wenn das Objekt bereits initialisiert wurde.