Кажется, что StructureMap AlwaysUnique не работает с внедрением конструктора - PullRequest
3 голосов
/ 23 августа 2009

У меня есть эта конфигурация в моем общем реестре:

ForRequestedType<IClientBonusHistoryLoadTask>().AlwaysUnique().TheDefaultIsConcreteType<ClientBonusHistoryLoadTask>();

И у меня есть этот код:

public ClientAdvantagesUpdateTask(IBaseRepo<Client> repository, INHUnitOfWorkProvider uowProvider, IClientBonusHistoryLoadTask clientBonusHistoryLoadTask, ClientBonusHistoryLoadTask masterClientBonusHistoryLoadTask) : base(repository, uowProvider)
    {
      _clientBonusHistoryLoadTask = clientBonusHistoryLoadTask;
      _masterClientBonusHistoryLoadTask =
masterClientBonusHistoryLoadTask;

      bool y = clientBonusHistoryLoadTask.Equals
(masterClientBonusHistoryLoadTask);

      var task = ObjectFactory.GetInstance<IClientBonusHistoryLoadTask>
();
      var task2 =
ObjectFactory.GetInstance<IClientBonusHistoryLoadTask>();

      bool x = task.Equals(task2);
    }

По какой-то причине у истинно (что является проблемой), а х ложно (который работает, как ожидалось). Это ошибка, или я что-то делаю неправильно?

1 Ответ

1 голос
/ 26 августа 2011

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

         "For^ILeadRepository^().Use^LeadRepository^();"

^ должно быть в скобках. Я не могу здесь печатать по какой-то причине.

, а затем внутри метода фабрики объектов:

       " LeadRepository instance = ioc.GetInstance^LeadRepository^();
        ioc.Inject(typeof(ILeadRepository), instance);
        ioc.Inject(typeof(LeadRepository), instance); "

где ioc - контейнер IContainer. опять же, я не уверен, что Inject должен использоваться таким образом, но это всегда тянет одинаково Экземпляр LeadRepository из контейнера ioc после запуска кода внедрения. Надеюсь, что это поможет, или кто-то может написать о том, как это должно быть сделано. Мне не нравится использовать статические фабрики или статические методы, поэтому я создал собственную фабрику, и все внутри этой фабрики извлекает уникальные экземпляры из контейнера ioc, используя приведенный выше код.

----- Если вы хотите уникальный экземпляр, то есть сингелтон на фабрику. и вы всегда хотите вернуть один и тот же экземпляр. Я нашел лучший способ сделать это и использовать субконтейнеры на фабрике:

, например

      myParentContainer = new Container(
             x =>
               {
                  x.AddRegistry<ObjectFactoryModelRegistry>();
                   x.AddRegistry<ServiceRegistry>();
                });

             myIoc = myParentContainer.GetNestedContainer(); 

             myIoc.AssertConfigurationIsValid();

.. затем можно получить тот же экземпляр, используя код ниже:

           myIoc.GetInstance<T>;
...