首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将特定封闭的泛型类型注册到Autofac

将特定封闭的泛型类型注册到Autofac
EN

Stack Overflow用户
提问于 2013-03-05 22:38:03
回答 1查看 51.1K关注 0票数 34

我有一个UnitofWork类,它实现了IUnitOfWork。我试着用Autofac注册它:

代码语言:javascript
复制
var builder = new ContainerBuilder();
builder
    .RegisterGeneric(typeof(UnitOfWork<Repository<>,>))
    .As(typeof(IUnitOfWork))
    .InstancePerDependency();

实现方式为:

代码语言:javascript
复制
public class UnitOfWork<T, O> : IUnitOfWork
    where T : Repository<O>
    where O : BaseEntity
{
}

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

给出错误"Type expected"

但是这个工作在另一个项目上:

代码语言:javascript
复制
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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-06 00:14:31

您不能在typeof中部分打开类(例如,对于UnitOfWork<Repository<>,>,您指定了T,但没有指定O) 类中尝试使用:

代码语言:javascript
复制
var builder = new ContainerBuilder();
builder
    .RegisterGeneric(typeof(UnitOfWork<,>))
    .As(typeof(IUnitOfWork))
    .InstancePerDependency();

where T : Repository<O>泛型约束将处理第一个参数应该是Repository<>

,但它不能与 RegisterGeneric 一起使用,因为它需要一个通用接口,因此需要创建一个IUnitOfWork<T,O>

但是你的模型非常奇怪。为什么您的UnitOfWork需要Repository<>类型参数?

您可以在UnitOfWork<E>构造函数中获取Repository<>,而不是将其作为类型参数:

代码语言:javascript
复制
public class UnitOfWork<E> : IUnitOfWork<E> where E : BaseEntity
{
    private readonly Repository<E> repository;

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

    //.. other methods

}

Where IUnitOfWork<E>

代码语言:javascript
复制
public interface IUnitOfWork<E> : IDisposable where E : BaseEntity
{
    void SaveChanges();
}

和Autofac注册:

代码语言:javascript
复制
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>>();
票数 72
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15226536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档