1

我有下面的類:統一不解析庫

SuppliersRepository.cs(與限定方法的接口):

public class SuppliersRepository : BaseRepository,ISuppliersRepository 
    { 
     public IEnumerable<Supplier> GetSuppliersByCoordinates(double latitude, double longitude) 
     { 
      using (IDbConnection connection = OpenConnection()) 
      { 
       const string query = "SELECT ID=SupplierID,Name=Suppliername FROM suppliers WHERE dbo.Distance(@latitude,@longitude,latitude,longitude) < 15 AND latitude IS NOT NULL AND longitude IS NOT NULL"; 
       return connection.Query<Supplier>(query, new { latitude = latitude,longitude=longitude }); 
      } 
     } 

    } 

BaseRepository.cs(與限定的方法中的接口)

public abstract class BaseRepository: IBaseRepository 
{ 
    public IDbConnection OpenConnection() 
    { 
     IDbConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["myconnection"].ConnectionString); 
     connection.Open(); 
     return connection; 
    } 

}

一個Bootstraper.cs從的global.asax.cs調用:

public static class Bootstrapper 
    { 
     public static void Initialise() 
     { 
      var container = BuildUnityContainer(); 

      DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
     } 

     private static IUnityContainer BuildUnityContainer() 
     { 
      var container = new UnityContainer(); 

      container.RegisterType<IBaseRepository, BaseRepository>(); 
      container.RegisterType<ISuppliersRepository, SuppliersRepository>(); 
      container.RegisterInstance<IHttpControllerActivator>(new HttpControllerActivator(container)); 
      container.RegisterControllers(); 


      return container; 
     } 
    } 

而且兩個控制器,第一個解決了倉庫罰款:

public class VenueController : MasterController 
    { 
     [Dependency] 
     public SuppliersRepository _SuppliersRepository { get; set; } 
    } 

但是這一次失敗:

public class AjaxController : Controller 
    { 
     [Dependency] 
     public BaseRepository _BaseRepository { get; set; } 
} 

它拋出一個System.InvalidOperationException:類型BaseRepository不能被構建。您必須配置容器以提供此值。

任何想法我做錯了什麼?

+0

最好使用構造函數注入而不是屬性注入。這樣你就不必用'[Dependency]'屬性修飾你的屬性,並且防止你的應用程序代碼依賴於Unity。 – Steven 2012-04-05 13:48:45

回答

2

首先,在使用依賴注入時,最好是對接口有依賴關係,而不要依賴具體的類。我會改變你的控制器

public class VenueController : MasterController 
{ 
    [Dependency] 
    public ISuppliersRepository _SuppliersRepository { get; set; } 
} 


public class AjaxController : Controller 
{ 
    [Dependency] 
    public IBaseRepository _BaseRepository { get; set; } 
} 

其次,BaseRepositoryabstract類。抽象類的實例是不能構造的,我認爲這就是爲什麼它在統一實際創建BaseRepository時失敗的原因。你應該注入具體的類。

container.RegisterType<IBaseRepository, SomeConcreteImplementationOfBaseRepository>(); 
+0

+1 BaseRepository的確是抽象的。 – StuartLC 2012-04-05 12:19:36

+0

感謝你們,我很懶,我在我的BaseRepository中添加了方法,如果不能被構造爲抽象的,我然後將該方法移動到另一個基於BaseRepository的類,現在它工作正常。 – 2012-04-05 12:39:05

0

你應該定義你的類以IRepository的屬性,如:

public class AjaxController : Controller 
{ 
     [Dependency] 
     public IRepository _BaseRepository { get; set; } 
} 

你的屬性應該總是在接口,而不是具體的實現來定義的,否則你自己綁在執行,從而使得依賴注入的使用變得毫無意義!

+0

夠公平的,我最初注入的界面,但我改變了這一點,因爲它不工作,並沒有想法! – 2012-04-05 12:26:11

+0

@RB - 儘管您正確地認爲DI通常用於界面分離,但OP可以使用Unity將派生的SuppliersRepository注入任何BaseRepository屬性,即container.RegisterType (); – StuartLC 2012-04-05 12:40:05