2016-11-28 66 views
0

我的一般問題是使用SimpleInjector來實現我的通用資源庫。使用通用資源庫實現簡單注入器

我有一個接口IRepository<T> where T : class和一個實現接口的抽象類abstract class Repository<C, T> : IRepository<T> where T : class where C : DbContext。最後,我有我的實體存儲庫,它繼承了抽象類。這裏有一個形而下例如:

public interface IRepository<T> where T : class 
{ 
    IQueryable<T> GetAll(); 
    IQueryable<T> FindBy(Expression<Func<T, bool>> predicate); 
    void Add(T entity); 
    void Remove(T entity); 
} 


public abstract class Repository<C, T> : IRepository<T> 
    where T : class where C : DbContext, new() 
{ 
    private C _context = new C(); 
    public C Context 
    { 
     get { return _context; } 
     set { _context = value; } 
    } 
    public virtual IQueryable<T> GetAll() 
    { 
     IQueryable<T> query = _context.Set<T>(); 
     return query; 
    } 
    ... 
} 

public class PortalRepository : Repository<SequoiaEntities, Portal> 
{ 
} 

在我的Global.asax.cs文件,下的Application_Start()函數,我說:

Container container = new Container(); 
container.Register<IRepository<Portal>, Repository<SequoiaEntities, Portal>>(); 
container.Verify(); 

當我啓動我的項目,簡單的注射器試圖驗證容器並且出現錯誤:

其他信息:給定類型Repository<SequoiaEntities, Portal>不是具體類型。請使用其他重載之一來註冊此類型。

有沒有一種方法來實現簡單的噴油器與泛型類或我必須通過特定的類?

+4

您應該註冊不是抽象的類型,但最後一個:PortalRepository:* container.Register ,PortalRepository>(); *抽象類的問題是它不能被實例化。 – 3615

+0

@ 3615你應該把它作爲一個答案 – Nkosi

回答

1

Register<TService, TImpementation>()方法允許您指定在請求指定服務(TService)時由Simple Injector創建的具體類型(TImplementation)。然而,指定的實現Repository<SequoiaEntities, Portal>標記爲abstract。這不允許Simple Injector創建它;抽象類無法創建。 CLR不允許這樣做。

但是,您確實有一個具體的類型PortalRepository,我相信您的目標是返回該類型。因此,你的配置應該如下:

container.Register<IRepository<Portal>, PortalRepository>(); 

或者,你可以使用簡單的噴油器的批量註冊設施,並在一個呼叫註冊您的所有庫:

Assembly[] assemblies = new[] { typeof(PortalRepository).Assembly }; 

container.Register(typeof(IRepository<>), assemblies); 
+0

在第二種情況下,typeof(PortalRepository)',它只用於PortalRepository類,但你談論註冊所有的存儲庫? –

+0

@DervisFindik這個例子顯示了與'PortalRepository'所在的位置相同的程序集*中的所有倉庫的註冊。 – Steven

相關問題