Я думаю о них как о дисциплинированном способе использования множественного наследования, потому что в конечном счете mixin - это еще один класс python, который (может) будет следовать соглашениям о классах, которые называются mixins.
Мое понимание соглашения, которые управляют тем, что вы бы назвали Mixin, состоят в том, что Mixin:
object
( в Python) Таким образом, он ограничивает потенциальную сложность множественного наследования и позволяет легко отслеживать поток вашей программы, ограничивая, где вы должны смотреть (по сравнению с полным множественным наследованием ). Они похожи на рубиновые модули.
Если я хочу добавить переменные экземпляра (с большей гибкостью, чем допускается одиночным наследованием), то я склонен идти на композицию.
Сказав, что , Я видел классы, называемые XYZMixin, которые имеют переменные экземпляра.
Вы не должны дразнить AutoMapper, можно просто ввести реальный, как объяснено здесь :
var myProfile = new MyProfile();
var configuration = new MapperConfiguration(cfg => cfg.AddProfile(myProfile));
IMapper mapper = new Mapper(configuration);
можно ввести этот картопостроитель в модульных тестах. Смысл использования инструментов как AutoMapper для Вас не имеющий необходимость написать много отображающегося кода. При насмешке AutoMapper, Вы закончите тем, что имели необходимость сделать это.
Как лучше всего настроить фиктивное ожидание для функции Map в AutoMapper [?]
Вот один способ:
var mapperMock = new Mock<IMapper>();
mapperMock.Setup(m => m.Map<Foo, Bar>(It.IsAny<Foo>())).Returns(new Bar());
http://richarddingwall.name/2009/05/07 / mocking-out-automapper-with-dependency-injection /
Указывает на другой способ обработки зависимостей для AutoMapper, который в основном заменит мою попытку извлечь мой собственный интерфейс IMapper. Вместо этого я попытаюсь использовать существующий IMappingEngine в качестве зависимости для моих классов, чтобы проверить, работает ли это.
Что вам нужно сделать, так это настроить AutoMapper следующим образом (StructureMap - это IoC). Затем вы можете сделать свои сервисы зависимыми от IMappingEngine. Оттуда издевательство должно быть очень простым.
public class AutoMapperConfigurationRegistry : Registry
{
public AutoMapperConfigurationRegistry()
{
ForRequestedType<Configuration>()
.CacheBy(InstanceScope.Singleton)
.TheDefault.Is.OfConcreteType<Configuration>()
.CtorDependency<IEnumerable<IObjectMapper>>().Is(expr => expr.ConstructedBy(MapperRegistry.AllMappers));
ForRequestedType<ITypeMapFactory>().TheDefaultIsConcreteType<TypeMapFactory>();
ForRequestedType<IConfigurationProvider>()
.TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<Configuration>());
ForRequestedType<IConfiguration>()
.TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<Configuration>());
}
}