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;
    }

}

从 global.asax.cs 调用的Bootstraper.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。您必须配置容器以提供此值。

知道我在做什么错吗?

4

2 回答 2

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>();
于 2012-04-05T12:17:41.127 回答
0

您应该定义您的类以获取 IRepository 的属性,例如:

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

您的属性应始终根据接口定义,而不是具体实现,否则您将自己绑定到实现,从而使依赖注入的使用变得毫无意义!

于 2012-04-05T12:13:03.170 回答