Search code examples
structuremapstructuremap3

Register singleton that implements two interfaces


What is the correct way to configure an object in structuremap that implements two interface but is a singleton.

For example class Main implements both iMainFrmService and iActiveJobService.

Here is what I've tried, but I'm not sure if it's correct.

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

Solution

  • As mentioned in the answer linked to from the comment above, x.Forward< , >() does give the singleton for both the interfaces.

    Please check out this dotnetfiddle for a working sample. Here is snippet that is posted there:

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