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