c# - StructureMap - 如何注册和解析开放泛型类型

标签 c# repository structuremap ioc-container

public interface IRepository<T> where T : Entity
{
    void Delete(T entity);
    T[] GetAll();
    T GetById(int id);
    void SaveOrUpdate(T enity);
    void Merge(T entity);
}

public interface ITeamEmployeeRepository : IRepository<TeamEmployee>
{
    PagedList<TeamEmployee> GetPagedTeamEmployees(int pageIndex, int pageSize);
}


public class Repository<T> : IRepository<T> where T : Entity
{
    private readonly ISession _session;

    protected Repository()
    {
        _session = GetSession();
    }

    public virtual void Delete(T entity)
    {
        _session.Delete(entity);
    }

    public virtual T[] GetAll()
    {
        return _session.CreateCriteria<T>().List<T>().ToArray();
    }

    public virtual T GetById(int id)
    {
        return _session.Get<T>(id);
    }

    public virtual void SaveOrUpdate(T enity)
    {
        _session.SaveOrUpdate(enity);
    }

    public void Merge(T entity)
    {
        _session.Merge(entity);
    }

    protected ISession GetSession()
    {
        return new SessionBuilder().GetSession();
    }
}

public class TeamEmployeeRepository : Repository<TeamEmployee>, ITeamEmployeeRepository
{
    public PagedList<TeamEmployee> GetPagedTeamEmployees(int pageIndex, int pageSize)
    {
        return GetSession().QueryOver<TeamEmployee>()
            .Fetch(x => x.Employee).Eager
            .Fetch(x => x.Team).Eager
            .ToPagedList(pageIndex, pageSize);
    }
}

现在我按如下方式注册存储库:

For<ILoanedItemRepository>().Use<LoanedItemRepository>();
For<ITeamEmployeeRepository>().Use<TeamEmployeeRepository>();
For<IArticleRepository>().Use<ArticleRepository>();
For<ISalesmanRepository>().Use<SalesmanRepository>();
For<ISalesmanArticleRepository>().Use<SalesmanArticleRepository>();
For<IGoodsGroupRepository>().Use<GoodsGroupRepository>();
For<IEmployeeRepository>().Use<EmployeeRepository>();

这真的很麻烦,尤其是当出现新的存储库时。

更容易和更好的注册是:

For(typeof(IRepository<>)).Use(typeof(Repository<>));

但这行不通。 StructureMap 每次都告诉我没有为 PluginFamily Core.Domain.Bases.Repositories.ITeamEmployeeRepository 定义默认实例。

我在 stackoverflow 上搜索并发现了一些新东西:

Scan(x =>
{
    x.AssemblyContainingType(typeof(TeamEmployeeRepository));
    x.AddAllTypesOf(typeof (IRepository<>));
    x.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
});

但还是一样的错误提示。

我必须如何使用 StructureMap 2.6.1.0 注册我的存储库?

最佳答案

我找到了解决方案。

Scan(x =>
{
    x.WithDefaultConventions();
    x.AssemblyContainingType(typeof(TeamEmployeeRepository));
    x.AddAllTypesOf(typeof(Repository<>));
    x.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
});

WithDefaultConventions 是所示代码的重要部分,因为通过此设置,您可以说 StructureMap 使用将 ITeamEmployeeRepository 映射到 TeamEmployeeRepository 的约定。所以 StructureMap 假设类的命名类似于接口(interface)的名称,没有前缀 I

关于c# - StructureMap - 如何注册和解析开放泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4063023/

相关文章:

c# - 将模型变量绑定(bind)到 ASP.NET MVC3 中的操作方法

c# - 同一类型的多个实例

asp.net-mvc - 在 ASP.NET MVC 中使用 StructureMap 注入(inject) Multi-Tenancy 存储库

wpf - WPF 应用程序的 IoC 容器

c# - LINQ: 'Select c' 和 'Select new (c...' 之间的区别

c# - 从 C# 和 Mono 启动进程时内存不足

c# - 如何在 MongoDB C# 驱动程序中为字段全局设置属性

java - 通过 sardine-webdav -jcr 添加 zip 文件

maven - 为什么 Nexus 存储库在使用组存储库时不下载所需的 Artifact ?

java - 启动和运行私有(private) Maven 存储库的最快方法是什么?