Подбираем репозитории с помощью Structuremap - PullRequest
0 голосов
/ 27 мая 2010

Я не уверен, как использовать StructureMap для сканирования всех репозиториев в определенном пространстве имен. Большинство хранилищ имеют вид:

namespace CPOP.Infrastructure.Repositories
{
    public class PatientRepository : LinqRepository<Patient>, IPatientRepository
    {
    }
}

namespace CPOP.Infrastructure.Repositories
{
    public class LinqRepository<T> : Repository<T>, ILinqRepository<T>
    {
    }
}

namespace CPOP.Domain.Contracts.Repositories
{
    public interface IPatientRepository : ILinqRepository<Patient>
    {
    }
}

Я пытался:

x.Scan(scanner =>
{
    scanner.Assembly(Assembly.GetExecutingAssembly());
    scanner.ConnectImplementationsToTypesClosing(typeof(ILinqRepository<>));
})

Но это только класс LinqRepository. Какой лучший способ подобрать различные репозитории, которые я буду там выгружать?

И, в соответствии с рекомендациями Джошуа, вот пример использования:

namespace CPOP.ApplicationServices
{
    public class PatientTasks : IPatientTasks
    {
        private readonly IPatientRepository _patientRepository;

        public PatientTasks(IPatientRepository patientRepository)
        {
            _patientRepository = patientRepository;
        }

        public Patient GetPatientById(int patientId)
        {
            int userId; // get userId from authentication mechanism

            return _patientRepository.FindOne(new PatientByIdSpecification(patientId));
        }

        public IEnumerable<Patient> GetAll()
        {
            int userId; // get userId from authentication mechanism

            return _patientRepository.FindAll();
        }

    }
}

Ответы [ 2 ]

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

Это можно сделать с помощью одной строки кода в вашей конфигурации. Предполагая, что у вас есть это:

Объекты: - Покупатель - Заказ

И есть общая модель хранилища, подобная этой:

  • Репозиторий: IRepository

И есть сервисы приложений, которые выглядят так:

public AppService(IRepository<Customer> custRepo, IRepository<Order> orderRepo)

У вас было бы что-то вроде этого. Обратите внимание на использование сканера для подключения ваших пользовательских репозиториев.

public class SmRegistry : Registry
    {
        public SmRegistry()
        {
            For(typeof (IRepository<>))
                .Use(typeof (Repository<>));

            //using this will find any custom repos, like CustomerRepository : Repository<Customer>
            //Scan(scanner =>
            //         {
            //             scanner.TheCallingAssembly();
            //             scanner.ConnectImplementationsToTypesClosing(typeof (IRepository<>));

            //         });
        }
    }

Предполагая, что ваши хранилища определены в какой-то другой сборке из вашего приложения, вы можете использовать реестры, чтобы связать все это вместе. Проверьте это сообщение:

http://blog.coreycoogan.com/2010/05/24/using-structuremap-to-configure-applications-and-components/

0 голосов
/ 27 мая 2010

Что-то вроде:

        Assembly ass = Assembly.GetCallingAssembly();
        Container.Configure(x => x.Scan(scan =>
        {
            scan.Assembly(ass); 
            scan.LookForRegistries();
        }));

Тогда класс реестра:

public sealed class MyRegistry : Registry
{
 ...
...