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();
}
エラーが発生しました"Type expected"
しかし、これは別のプロジェクトで動作します:
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();
部分的にクラスを開くことはできません(たとえば、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>
を作成する必要があります…
しかし、あなたのモデルは非常に奇妙です。なぜ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>>();