StructureMap - Wie sich zu registrieren und aufzulösen, ein offener generischer Typ

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);
    }
}

Ich vorerst registrieren Sie das repository wie folgt:

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>();

Dies ist wirklich mühsam, vor allem, wenn es kommt entlang der neuen repositories.

Eine leichtere und bessere Registrierung wäre:

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

Aber das funktioniert nicht. StructureMap ist jedesmal sagt mir, dass kein Standard-Instanz definiert PluginFamily Kern.Domain.Basen.Repositories.ITeamEmployeeRepository.

Suchte ich auf stackoverflow gefunden und etwas neues:

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

Aber immer noch die gleiche Fehlermeldung.

Wie kann ich mich registrieren, meine Repositorys mit StructureMap 2.6.1.0?

  • Während dies nicht direkt Ihre Frage zu beantworten, werfen Sie bitte einen Blick auf diesen Artikel: stackoverflow.com/questions/4128640/.... Es zeigt eine alternative Art und Weise der Umsetzung der repository-pattern. Die Umsetzung verbirgt Ihre Repositorys hinter einer Einheit von Arbeit und Sie brauchen nur zu registrieren IUnitOfWorkFactory und du bist fertig.
InformationsquelleAutor Rookian | 2010-10-31
Schreibe einen Kommentar