Как создать экземпляр структуры структуры на основе типа - PullRequest
0 голосов
/ 12 сентября 2010

Хорошо, возможно, это не лучший заголовок, но я борюсь с тем, как его назвать. Вот что у меня есть:

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

this.For<ICategoryMapper>()
    .Use<CategoryMapper>()
    .Named("CategoryMapper");

Но теперь у меня проблема с получением экземпляра из StructureMap в форме, которую я могу использовать. Потому что я не могу запросить это как обычно с кодом, подобным этому:

ObjectFactory.GetNamedInstance<T>(namedInstance);

Причина в том, что я действительно не знаю тип. Я просто знаю, что это должно быть имя DomainType плюс слово mapper. Возможно, есть лучший способ добиться этого, но я не знаю, что делать.

Любой вклад в лучший способ добиться этого или исправить проблему, с которой я столкнулся, был бы великолепен.

1 Ответ

2 голосов
/ 13 сентября 2010

Вам нужно использовать именованные экземпляры, или это была просто попытка заставить его работать?

Один из подходов, который вы могли бы сделать, это добавить интерфейс маркера, который объявляет DomainType, с которым работает маппер.Например:

public class PersonMapper : ICategoryMapper, ICategoryMapper<Person>{
}

Зарегистрируйте сопоставители в контейнере:

ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.ConnectImplementationsToTypesClosing(typeof (ICategoryMapper<>));
        scan.AddAllTypesOf<ICategoryMapper>();
    });
});

Затем вы можете получить сопоставитель для вашего DomainType (например, Person):

ObjectFactory.ForGenericType(typeof(ICategoryMapper<>))
  .WithParameters(typeof(Person))
  .GetInstanceAs<ICategoryMapper>();
...