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);
}
}
現在我註冊庫如下:StructureMap - 如何註冊和解析的開放式泛型類型
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定義默認實例。
我搜索了計算器,發現一些新的東西:
Scan(x =>
{
x.AssemblyContainingType(typeof(TeamEmployeeRepository));
x.AddAllTypesOf(typeof (IRepository<>));
x.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
});
但還是同樣的錯誤消息。
如何使用StructureMap 2.6.1.0註冊我的存儲庫?
雖然這不直接回答你的問題,請看看這篇文章:http://stackoverflow.com/questions/4128640/how-to-remove-unit-of-work-functionality-from-repositories-using -ioc/41 32186#4132186。它顯示了實現存儲庫模式的另一種方式。這個實現將你的倉庫隱藏在一個工作單元的後面,你只需要註冊一個'IUnitOfWorkFactory'就完成了。 – Steven 2010-11-11 08:52:05