2013-03-05 123 views
19

我有UnitofWork类,它实现了IUnitOfWork。我尝试注册与autofac:使用Autofac注册Generic类型

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

实施是:

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

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

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

给出了一个错误“类型期待”

但在另一个项目这一个工作

+0

“给出一个错误“预期类型”,你必须更加明确,你的意思是t C#编译器给出这个错误,对吧? – Steven 2013-03-05 15:27:59

+0

对不起,项目无法编译并出现UnitOfWork的“Type Expected”错误 shortcode 2013-03-05 16:03:12

回答

42

不能有部分开放课程(例如与UnitOfWork<Repository<>,>您指定T但不Otypeof,以尝试:

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<>

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

您对第二个存储库(第三个或更多...)的建议是什么? – shortcode 2013-03-06 07:02:20

+0

“第二储存库(第三储存库......”)是什么意思?你已经有一个'Repository <>'或者你想拥有自定义派生的存储库?如果是的话,你需要我的第一个建议与'IUnitOfWork '在那里你指定的存储库,也是实体... – nemesv 2013-03-06 07:23:39

+0

感谢您的答案。它真的帮助了我。 – shortcode 2013-03-06 09:54:42