StructureMap Автоматическая регистрация универсальных типов с использованием Scan - PullRequest
9 голосов
/ 05 февраля 2009

У меня есть интерфейс:

IRepository<T> where T : IEntity

в то время как я вырубаю свой пользовательский интерфейс, я использую некоторые фальшивые реализации репозитория, которые просто возвращают любые старые данные.

Они выглядят так:

public class FakeClientRepository : IRepository<Client>

На данный момент я делаю это:

ForRequestedType<IRepository<Client>>()
   .TheDefaultIsConcreteType<FakeRepositories.FakeClientRepository>();

но много раз для всех моих сущностей. Можно ли использовать Scan для автоматической регистрации всех моих поддельных репозиториев для соответствующего IRepository?

Редактировать: это насколько я понял, но я получаю сообщения о том, что запрошенный тип не зарегистрирован: (

Scan(x =>
{
    x.TheCallingAssembly();
    x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>();
    x.AddAllTypesOf(typeof(IRepository<>));
    x.WithDefaultConventions();
});

Спасибо

Andrew

Ответы [ 3 ]

14 голосов
/ 03 июня 2010

Есть более простой способ сделать это. Пожалуйста, смотрите эту запись блога для деталей: Advanced StructureMap: подключение реализаций для открытия универсальных типов

public class HandlerRegistry : Registry
{
    public HandlerRegistry()
    {
        Scan(cfg =>
        {
            cfg.TheCallingAssembly();
            cfg.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>();
            cfg.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
        });
    }
}

Делая это таким образом, вы избавляетесь от необходимости создавать свои ITypeScanner или соглашения.

6 голосов
/ 06 февраля 2009

Спасибо Крис , это именно то, что мне было нужно. Для наглядности вот что я сделал по вашей ссылке:

Scan(x =>
{
    x.TheCallingAssembly();
        x.IncludeNamespaceContainingType<FakeRepositories.FakeClientRepository>();
    x.With<FakeRepositoryScanner>(); 
});


private class FakeRepositoryScanner : ITypeScanner
{
    public void Process(Type type, PluginGraph graph)
    {
        Type interfaceType = type.FindInterfaceThatCloses(typeof(IRepository<>));
        if (interfaceType != null)
        {
            graph.AddType(interfaceType, type);
        }
    }
} 
2 голосов
/ 05 февраля 2009

Посмотрите на это обсуждение в группе пользователей StructureMap: http://groups.google.com/group/structuremap-users/browse_thread/thread/649f5324c570347d

...