Как переопределить сопоставление плагинов 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/