0

我無法弄清楚如何讓Unity與我的通用存儲庫一起工作。這是我的基本設置:Unity依賴注入 - 具有通用存儲庫的方法返回類型

public static Repository<IEntity> GetRepository() 
{ 
    //This is of type CustomerRepository 
    return unitOfWork.CustomerRepository;   
} 


CustomerRepository : Repository<Customer>, ICustomerRepository 
Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity 

ICustomerRepository : IRepository<Customer> 
IRepository<TEntity> : IDisposable where TEntity : class, IEntity 

Customer : IEntity 

在返回unitOfWork.CustomerRepository的錯誤是:

不能鍵入 'CustomerRepository' 隱式轉換爲 '資源庫'

完全迷路了,我已經嘗試了很多註冊方法,以至於我開始認爲我需要做其他事情來實現我想要的功能......在這一點上,我不知道我在使用RegisterType進行的操作,如您所見:

container.RegisterType<IEntity, Customer>(); 
container.RegisterType(typeof(Repository<Customer>), typeof(CustomerRepository)); 
container.RegisterType(typeof(CustomerRepository), typeof(Repository<Customer>)); 

container.RegisterType(typeof(Repository<IEntity>), typeof(Repository<Customer>)); 
container.RegisterType(typeof(Repository<Customer>), typeof(Repository<IEntity>)); 


container.RegisterType(typeof(Repository<>), typeof(Repository<IEntity>)); 
container.RegisterType(typeof(Repository<IEntity>), typeof(Repository<>)); 

      //--------- 

container.RegisterType(typeof(IRepository<Customer>), typeof(Repository<IEntity>)); 
container.RegisterType<IRepository<Customer>, CustomerRepository>(); 
container.RegisterType(typeof(Repository<IEntity>), typeof(CustomerRepository)); 


      //-------------------- 
container.RegisterType(typeof(IRepository<>), typeof(Repository<>)); 
container.RegisterType<ICustomerRepository, CustomerRepository>(); 

container.RegisterType<IRepository<Customer>, ICustomerRepository>(); 
container.RegisterType<Repository<Customer>, CustomerRepository>(); 
container.RegisterType<IRepository<Customer>, CustomerRepository>(); 

container.RegisterType<IRepository<Customer>, ICustomerRepository>(); 
container.RegisterType<Repository<Customer>, CustomerRepository>(); 
container.RegisterType<IRepository<Customer>, CustomerRepository>(); 

container.RegisterType(typeof(IRepository<IEntity>), typeof(IRepository<Customer>)); 

沒有任何註冊它的方法正在幫助。

編輯1:

我怎樣才能得到這個工作?:

public static Repository<TEntity> GetRepository<TEntity>(string entityName, string conectionName) where TEntity : class, IEntity 
{ 
    var unitOfWork = new UnitOfWork(connectionName); 

    switch(entityName){ 
    case "Customer": 
      return unitOfWork.CustomerRepository; 
    } 

    return null; 
} 

回答

0

如果我理解正確,並打破在多行代碼,你這樣做:

public static Repository<IEntity> GetRepository() 
{ 
    CustomerRepository repository1 = unitOfWork.CustomerRepository; 
    Repository<IEntity> repository2 = repository1; 
    return repository2; 
} 

因此,間接地,您將類型CustomerRepository的值賦值爲Repository<IEntity>,這將不起作用,因爲Repository<IEntity>不是基本類型CustomerRepository。另一方面,類型Repository<Customer>CustomerRepository的基類,因此將CustomerRepository指定給Repository<Customer>將起作用。

*編輯*

根據您的意見,一些新的見解:

public static Repository<TEntity> GetRepository<TEntity>() 
    where TEntity : class, IEntity 
{ 
    if (typeof(TEntity) == typeof(Customer)) 
     return (Repository<TEntity>)(object)new Repository<Customer>(); 
    if (typeof(TEntity) == typeof(Product)) 
     return (Repository<TEntity>)(object)new Repository<Product>(); 
    throw new Exception("Entity of type " + typeof(IEntity).Name + " is not supported."); 
} 

還是......使用反射(慢):

public static Repository<TEntity> GetRepository<TEntity>() 
    where TEntity : class, IEntity 
{ 
    Type repositoryType = typeof(Repository<>).MakeGenericType(typeof(TEntity)); 
    return (Repository<TEntity>)Activator.CreateInstance(repositoryType); 
} 
+0

是的,那是相當很多我在做什麼,但我需要該方法的返回類型是通用的。我認爲我可以用依賴注入來實現這一點,但我猜不是嗎? 我也試過這樣: '公共靜態庫 GetRepository ()其中TEntity:類,IEntity' 其中return語句是: '庫 repository2 = repository1;' 基本上,我想基於參數的某個存儲庫並一般使用它。你知道這是否是正確的方向,或者我可以如何用Unity實現這一點? – nworbkcin

+0

兩個單獨的問題:1.您是否考慮製作IRepository 協變? 2.如果'TEntity'設置爲'Customer',我想你只想返回'CustomerRepository'。在你的例子中,爲什麼你總是返回'CustomerRepository'? –

+0

它被簡化了,例如,如果我將'TEntity'作爲'Customer',我想'CustomerRepository'。如果我把'TEntity'作爲'Product',我想'ProductRepository'。我只是拿出所有不相關的東西,不要分心我的真正問題。'IRepository 'covariant是什麼意思? – nworbkcin