Frage

Was ist der richtige Weg, um ein Objekt in Structuremap zu konfigurieren, das zwei Schnittstellen implementiert, aber ein Singleton ist.

Zum Beispiel Klasse Main implementiert beides iMainFrmService und iActiveJobService.

Folgendes habe ich versucht, aber ich bin mir nicht sicher, ob es richtig ist.

ObjectFactory.Initialize(pExpression=>
{
  pExpression.ForSingletonOf<iMainFrmService>().Use<Main>();
  pExpression.ForSingletonOf<iActiveJobService>().Use<Main>();
});
War es hilfreich?

Lösung

Wie in erwähnt die Antwort verlinkt mit dem obigen Kommentar, x.Forward< , >() gibt den Singleton für beide Schnittstellen an.

Bitte überprüfen Sie dies dotnetfiddle für eine Arbeitsprobe.Hier ist ein Ausschnitt, der dort gepostet wird:

using System;
using StructureMap;

namespace StructureMapSingleton {
    public class Program {
        public static void Main(string [] args) {
            Bootstrapper.Initialize();

            var mainService = Bootstrapper.GetInstance<IMainService>();
            mainService.MainMethod();

            var secondaryService = Bootstrapper.GetInstance<ISecondaryService>();
            secondaryService.SecondMethod();

            Console.ReadLine();
        }
    }

    public interface IMainService {
        void MainMethod();
    }

    public interface ISecondaryService {
        void SecondMethod();
    }

    public class MainService : IMainService, ISecondaryService {
        private int _invokeCount;

        public void MainMethod() {
            this._invokeCount++;
            Console.WriteLine("In MainService: MainMethod ({0})", this._invokeCount);
        }

        public void SecondMethod() {
            this._invokeCount++;
            Console.WriteLine("In MainService: SecondMethod ({0})", this._invokeCount);
        }
    }

    public class Bootstrapper {
        private static Container _container;

        public static void Initialize() {
            _container = new Container(x => {
                                           x.For<IMainService>().Singleton().Use<MainService>();
                                           //x.For<ISecondaryService>().Singleton().Use<MainService>();
                                           x.Forward<IMainService, ISecondaryService>();
                                       });
        }

        public static T GetInstance<T>() {
            return _container.GetInstance<T>();
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top