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);
}
}
Na razie zarejestrowania repozytorium następująco:StructureMap - Jak zarejestrować się i rozwiązać otwartą ogólny typ
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>();
Jest to bardzo kłopotliwe, zwłaszcza jeśli chodzi wzdłuż nowych repozytoriów.
Łatwiej i lepiej byłoby Rejestracja:
For(typeof(IRepository<>)).Use(typeof(Repository<>));
Ale to nie działa. StructureMap za każdym razem mówi mi, że nie zdefiniowano domyślnej instancji dla PluginFamily Core.Domain.Bases.Repositories.ITeamEmployeeRepository.
Szukałem na stackoverflow i znaleźć coś nowego:
Scan(x =>
{
x.AssemblyContainingType(typeof(TeamEmployeeRepository));
x.AddAllTypesOf(typeof (IRepository<>));
x.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
});
ale nadal ten sam komunikat o błędzie.
Jak mogę zarejestrować swoje repozytoria za pomocą StructureMap 2.6.1.0?
Chociaż to nie odpowiada bezpośrednio na twoje pytanie, proszę spojrzeć na ten artykuł: http://stackoverflow.com/questions/4128640/how-to-remove-unit-of-work-functionality-from-repositoriesi-using -ioc/41 32186 # 4132186. Pokazuje alternatywny sposób implementacji wzorca repozytorium. Implementacja ukrywa twoje repozytorium za jednostką pracy i musisz tylko zarejestrować jedną 'IUnitOfWorkFactory' i gotowe. – Steven