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/