Как переопределить сопоставление плагинов StructureMap 3

Мы используем StructureMap 3.1.6.186 и столкнулись с проблемой переопределения определенного плагина. В нашем случае у нас есть консольное приложение, которое мы развертываем на удаленном сервере. Консольное приложение имеет очень отдаленную зависимость от реализации, которая требует установки некоторых нежелательных COM-объектов на сервере. Поскольку мы точно знаем, что эта конкретная зависимость фактически не используется в нашем консольном приложении, мы пытаемся переопределить конкретную проблемную реализацию (IImageManipulator) с помощью фиктивной реализации, которую я создал прямо в главном Program.cs моего консольного приложения. Это избавит от необходимости устанавливать эти com-объекты на сервере и не нарушит работу консольного приложения.

Как вы увидите из приведенного ниже кода и комментариев, ни явная регистрация IImageManipulator в нижней части конструктора контейнера, ни внедрение сопоставления после создания контейнера не работают должным образом. Интересно, что когда я получаю экземпляр IImageManipulator в консольном приложении, он дает мне желаемую реализацию FakeImageManipulator. Однако, когда я получаю экземпляр IEndItemService, базовая реализация - это другой тип, который мне не нужен.

Любая идея, как переопределить все реализации определенного интерфейса, даже когда есть другие реестры, у которых этот интерфейс зарегистрирован? Благодаря тонну!

public class FakeImageManipulator : IImageManipulator
    {
        public Dictionary<ImageMetaDataEnum, string> GetMetaData(Image image, params ImageMetaDataEnum[] desiredMetaData)
        {
            throw new NotImplementedException();
        }
    }

    public override void ProgramLogic()
    {
        IContainer container = new Container(registry =>
        {
            registry.ForSingletonOf<ITypeResolver>().Use<StructureMapTypeResolver>();
            registry.ForSingletonOf<ILogger>().Use(() => MessageLogger.GetInstance());
            registry.ForSingletonOf<IConfigParser>().Use(() => ConfigParser.GetInstance());

            registry.Scan(scan =>
            {
                scan.AssemblyContainingType<ServiceRegistry>();
                scan.LookForRegistries();
            });

            //--hoping this would override anything that was already set in another registry
            registry.For<IImageManipulator>().Use(() => new FakeImageManipulator());
        });

        container.Model.For<IImageManipulator>().Default.EjectAndRemove();

        //--hoping this would override anything that was already set in another registry
        container.Inject(typeof(IImageManipulator), new FakeImageManipulator());

        //--this gets back the FakeImageManipulator as expected
        IImageManipulator actualImplementation = container.TryGetInstance<IImageManipulator>();

        //--the implementation of IImageManipulator created in here is NOT a FakeImageManipulator like I want, but is
        // instead the instance that is registered in some down stream registry
        var someOtherImplementationThatUsesAnIImageManipulatorDownStream = container.GetInstance<IEndItemsService>();

}

Изменить: также см. Этот пост группы Google с тем же вопросом: https://groups.google.com/forum/

0 ответов

Другие вопросы по тегам