Регистрация Singleton, который реализует два интерфейса

StackOverflow https://stackoverflow.com//questions/24042706

  •  21-12-2019
  •  | 
  •  

Вопрос

Какой правильный способ настроить объект в structureRemap, который реализует два интерфейса, но является синглтоном.

Например, класс Main реализует как iMainFrmService, так и генеракодичевать.

Вот что я пробовал, но я не уверен, правда ли это правильно.

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

Это было полезно?

Решение

Как уже упоминалось в Ответ , связанный с комментариев выше, x.Forward< , >() делает Singleton для обоих интерфейсов. .

Пожалуйста, ознакомьтесь с этим dotnetfiddle для рабочего образца.Вот фрагмент, который отправлен там:

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>();
        }
    }
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top