使用Structuremap拾取存储库

时间:2010-05-27 02:10:06

标签: interface dependency-injection structuremap

我不确定如何使用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 个答案:

答案 0 :(得分:2)

只需在配置中使用一行代码即可完成此操作。假设你有这个:

实体: - 客户 - 订单

并拥有这样的通用存储库模型:

  • 存储库: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/

答案 1 :(得分:0)

类似的东西:

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

然后是Registry类:

public sealed class MyRegistry : Registry
{
 ...