2013-03-05 174 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