2

IoCwに頭を悩ませようとしています。依存性注入と私はJoelAbrahamssonからのこのブログ投稿をフォローしました:http://joelabrahamsson.com/entry/inversion-of-control-introduction-with-examples-in-dotnet

私は次のようにプロジェクトを設定しました:

  • モデル
  • インターフェース
  • コントローラー
  • DAL

そして私のクラスは次のとおりです。

車両

public class Car
{
    public int Id { get; set; }
    public string Brand { get; set; }
    public string Year { get; set; }
}

CarController

public class CarController
 {
     private readonly ICar _carInterface;

     public CarController(ICar car)
     {
         _carInterface = car;
     }

     public void SaveCar(Car car)
     {
          _carInterface.SaveCar(car);
     }
}

ICarインターフェース

public interface ICar
{
    void SaveCar(Car car);
}

DbCar

public class DbCar: ICar
{
    public void SaveCar(Car car)
    {
        throw new NotImplementedException();
    }
}

さて、UIで、これをどうすればよいかわかりません;-)必要なCarオブジェクトを十分に作成できますが、CarControllerを新しく起動すると、(もちろん)ICarインターフェイスが必要になります。あげられない。

Joels(素晴らしい)の記事を読んでいる途中で何かを誤解しているような気がします:-)そして、誰かが私が見逃した/誤解したことに光を当てることができるのではないかと期待していました。

どんな助け/ヒントも大歓迎です!

よろしくお願いします。

ではごきげんよう、

ボー

4

2 に答える 2

2

ICar車へのインターフェースではないようです。むしろ、それは車を保存するためのリポジトリへのインターフェースです。したがって、それは呼び出されるべきですICarRepository(またはおそらくIGarage。)

あなたは言う:

しかし、CarControllerを新しくするとき、それは(もちろん)私がそれを与えることができないICarインターフェースを期待します。

なぜだめですか?実装がありDbCarます。なぜあなたはそれにそれらの1つを与えることができないのですか?

あなたはこの表現についてコメントで尋ねました:

new CarController(new DbCar())

具体的には、そのコード行を記述することで、コントローラーを車のリポジトリの特定の実装に関連付けました。

それは本当ですが、その場合に限ります。ユニットテストの他の場所で、次のように書くことができます。

new CarController(new FakeCarRepository())

このCarControllerクラスは独立したモジュールであり、他のものへの依存関係は、コンストラクターのパラメーターリストから明らかです。

IoCまたは「依存性注入」フレームワークは、などのクラスを構築するための標準的な方法を提供するライブラリであるため、CarController必要なパラメーターは構成ファイルで指定されます。しかし、それはおそらく単純なアプリにとってはやり過ぎです。

于 2012-09-18T13:43:55.687 に答える
0

依存性の注入と制御の反転を適切に行うには、インターフェイスベースの開発( SOLID原則の「I」)に準拠する必要があります。以下は、これを最大限に活用できるようにするために、クラスとインターフェースをどのように編成するかです。

ICarインターフェース

public interface ICar
{
    int Id { get; set; }
    string Brand { get; set; }
    string Year { get; set; }
}

車両

public class Car : ICar
{
    public int Id { get; set; }
    public string Brand { get; set; }
    public string Year { get; set; }
}

ICarRepositoryインターフェース

public interface ICarRepository
{
    void SaveCar(ICar car);
}

CarRepository

public class CarRepository : ICarRepository
{
    public void SaveCar(ICar car)
    {
        throw new NotImplementedException();
    }
}

ICarControllerインターフェース

public interface ICarController
{
     void SaveCar(ICar car);
}

CarController

public class CarController : ICarController
{
     private readonly ICarRepository _carRepository;

     public CarController(ICarRepository carRepository)
     {
         _carRepository = carRepository;
     }

     public void SaveCar(ICar car)
     {
          _carRepository.SaveCar(car);
     }
}

次に、次のことができます。

ICarRepository carRepository = new CarRepository();
ICarController carController = new CarController(carRepository);
ICar carOne = new Car { Id = 1, Brand = "Ford", Year = "2010" };
ICar carTwo = new Car { Id = 2, Brand = "Dodge", Year = "1999" };

carController.SaveCar(carOne);
carController.SaveCar(carTwo);
于 2012-09-18T14:03:40.913 に答える