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

そして2つのコントローラ、最初の1つはリポジトリをうまく解決します:

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 に答える