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);
}
}
Vorerst registrieren und lösen registriere ich das Repository wie folgt:StructureMap - Wie ein offenen generischen Typen
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>();
Das ist wirklich umständlich ist, vor allem, wenn es entlang der neuen Repositories kommt.
Eine einfachere und bessere Registrierung wäre:
For(typeof(IRepository<>)).Use(typeof(Repository<>));
Aber das funktioniert nicht. StructureMap sagt mir immer, dass keine Default Instance für PluginFamily Core.Domain.Bases.Repositories.ITeamEmployeeRepository definiert wurde.
suchte ich auf Stackoverflow und fand etwas Neues:
Scan(x =>
{
x.AssemblyContainingType(typeof(TeamEmployeeRepository));
x.AddAllTypesOf(typeof (IRepository<>));
x.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
});
aber immer noch die gleiche Fehlermeldung.
Wie muss ich meine Repositorys mit StructureMap 2.6.1.0 registrieren?
Während dies Ihre Frage nicht direkt beantwortet, werfen Sie einen Blick auf diesen Artikel: http://StackOverflow.com/Questions/4128640/How-to-Remove-Unit-of-Funktion-Funktions-von-Repositories-Verwendung -ioc/41 32186 # 4132186. Es zeigt eine alternative Möglichkeit, das Repository-Muster zu implementieren. Die Implementierung verbirgt Ihre Repositories hinter einer Arbeitseinheit und Sie müssen nur eine "IUnitOfWorkFactory" registrieren und Sie sind fertig. – Steven