如何将结构图用于通用存储库模式

本文关键字:存储 模式 用于 结构图 | 更新日期: 2023-09-27 17:59:32

使用以下通用存储库。

public interface IRepository<T> where T: class
{
    void Commit();
    void Delete(T item);
    IQueryable<T> Find();
    IList<T> FindAll();
    void Add(T item);     
}

如何对结构图进行编码以使用它?我使用Structuremap v2.6.1进行.net 3.5

public static void BootstrapStructureMap()
{
    ObjectFactory.Initialize(x =>
    {                   
        // This is giving me problems!
        x.For<IRepository<Employee>>().Use<IRepository<Employee>>(); 
    });
}

我得到以下错误:

StructureMap异常代码202没有为插件系列定义默认实例

如何将结构图用于通用存储库模式

使用For().Use()构造,当有人请求For中的类型时,您可以告诉StructureMap实例化Use中给定的类型。因此,通常情况下,您为For提供一个接口或抽象基类,因为您是针对抽象进行编程的。

这里的问题是,您将一个抽象类型(您的IRepository<T>)传递到了Use方法中。StructureMap将无法创建该接口的新实例。您需要创建IRepository<T>(例如EntityFrameworkRepository<T>)的通用实现并注册它。示例:

x.For<IRepository<Employee>>().Use<EntityFrameworkRepository<Employee>>();

然而,这很快就会导致大量注册,因为您将有十几个想要使用的存储库。因此,您可以使用开放泛型类型将其减少为一次注册,而不是为您想要使用的每个封闭泛型存储库进行多次注册,如下所示:

x.For(typeof(IRepository<>)).Use(typeof(EntityFrameworkRepository<>)));