Как мне зарегистрировать IPetFactory<TPet>
для разрешения с помощью DefaultPetFactory<TPet>
, где TPet
может быть любым классом на основе Pet
в приведенном ниже примере?
Я хотел бы иметь возможность разрешитьIPetFactory<Dog>
с DefaultPetFactory<Dog>
.
Я только что нашел примеры использования BasedOn
, где сама Фабрика основана на классе, а не на общем аргументе.
class Pet
{
public string Name { get; set; }
}
class Fish : Pet {}
class Dog : Pet {}
class Cat : Pet { }
interface IPetFactory<TPet> where TPet : Pet;
class DefaultPetFactory<TPet> : IPetFactory<Pet> where TPet : Pet
{
// default implementation
}
Моя реальная реализация имеет много классов, основанных на Pet, поэтому я ищу более общий подход, чем просто вызов регистра для каждого из них.
РЕДАКТИРОВАТЬ:
Я нашелпроблема была не в том, что я думал.Это было связано с общими аргументами и исключением из «арности определения универсального типа», которое вызвало мои проблемы.
И я слишком упростил свой пример.В моей реальной реализации мне нужны обобщенные аргументы, и оказывается, что Виндзору нужны те же универсальные параметры, чтобы иметь возможность разрешать тип.
Если я так сделаю, это не сработает.
class Owner
{
}
class DefaultPetFactory<TPet> : IPetFactory<Owner, TPet> where TPet : Pet
{
// default implementation
}
Если я так сделаю, это будет:
class DefaultPetFactory<TOwner, TPet> : IPetFactory<TOwner, TPet>
where TOwner : Owner
where TPet : Pet
{
// default implementation
}
Если у кого-то есть лучшее решение дляэто, желательно с регистрациями, это ценится.Я не люблю менять классы, чтобы регистрация работала.