34

私はUnitofWorkクラスを持っていて、それを実装していますIUnitOfWork。私はAutofacでそれを登録しようとします:

var builder = new ContainerBuilder();
builder
    .RegisterGeneric(typeof(UnitOfWork<Repository<>,>))
    .As(typeof(IUnitOfWork))
    .InstancePerDependency();

実装は次のとおりです。

public class UnitOfWork<T, O> : IUnitOfWork
    where T : Repository<O>
    where O : BaseEntity
{
}

public interface IUnitOfWork : IDisposable
{
    void SaveChanges();
}

「タイプが必要です」というエラーが表示されます

しかし、これは別のプロジェクトで動作します:

public class Repository<T> : GenericRepository<T> 
    where T : BaseEntity
{
    public Repository(IDbContext context) : base(context) { }   
}

public abstract class GenericRepository<T> 
    : IRepository<T>, IQueryable<T> where T : BaseEntity
{
}

builder
    .RegisterGeneric(typeof(Repository<>))
    .As(typeof(IRepository<>))
    .InstancePerHttpRequest();
4

1 に答える 1

72

部分的にクラスを開くことはできません(たとえば、指定したのにUnitOfWork<Repository<>,>を指定Tしなかった場合O) 。typeof

var builder = new ContainerBuilder();
builder
    .RegisterGeneric(typeof(UnitOfWork<,>))
    .As(typeof(IUnitOfWork))
    .InstancePerDependency();

一般where T : Repository<O>的な制約は、最初の引数がRepository<>

RegisterGenericただし、汎用インターフェイスが必要なため、これでは機能しません。そのため、…を作成する必要がありますIUnitOfWork<T,O>。</p>

しかし、あなたのモデルは非常に奇妙です。なぜ型引数UnitOfWorkが必要なのですか?Repository<>

型引数として持つ代わりに、コンストラクターで取得できRepository<>ます。UnitOfWork<E>

public class UnitOfWork<E> : IUnitOfWork<E> where E : BaseEntity
{
    private readonly Repository<E> repository;

    public UnitOfWork(Repository<E> repository)
    {
        this.repository = repository;
    }

    //.. other methods

}

どこ IUnitOfWork<E>

public interface IUnitOfWork<E> : IDisposable where E : BaseEntity
{
    void SaveChanges();
}

そして Autofac 登録:

var builder = new ContainerBuilder();
builder
    .RegisterGeneric(typeof(Repository<>)).AsSelf();
builder
    .RegisterGeneric(typeof(UnitOfWork<>))
    .As(typeof(IUnitOfWork<>))
    .InstancePerDependency();
var container = builder.Build();

// sample usage
var u = container.Resolve<IUnitOfWork<MyEntity>>();
于 2013-03-05T16:14:31.277 に答える