0

だから、特に「未知の具象をクラスに注入する」ときは、IoCを理解しています。コンストラクターまたはプロパティによってクラスに「ILogger」を注入する最も一般的な例。

今、私は古いファクトリーパターンを持っています.IoCに変換する方法/場合を理解しようとしています. (私はUnityを使用しています、fyi)。

以下に、以前の Factory パターンを示します。基本的には、現在のガス(ペトロ)の価格に基づいて工場で決定を下します。もしガソリンが本当に高いなら、私は自転車に乗っています。ガソリンが中程度の値段なら、私は車を運転しています。ガソリンが安くなったら、トラックを運転して仕事に行きます! (それはばかげた例です。そのまま転がしてください)。

私が理解していないのは、これを IoC に「変換」する方法です...具体的なクラスが返されるビジネスロジックの決定を行う場合です。

私は何が欠けていますか?多分私はまだ工場が必要ですか?それとも、いくつかの重要な概念がありませんか?

助けてくれてありがとう...

namespace MyApp
{
    public interface IVehicle
    {
        void MakeTrip();
    }

    public class Bicycle : IVehicle
    {
        public void MakeTrip() { Console.WriteLine("Bicycles are good when gas is expensive."); }
    }

    public class Car : IVehicle
    {
        public void MakeTrip() { Console.WriteLine("Cars are good when gas is medium priced"); }
    }

    public class PickupTruck : IVehicle
    {
        public void MakeTrip() { Console.WriteLine("Gas is back to 1980's prices.  Drive the truck!"); }
    }


    public static class VehicleFactory
    {

        public static IVehicle GetAConcreteVehicle(decimal priceOfGasPerGallon)
        {
            if (priceOfGasPerGallon > 4.00M)
            {
                return new Bicycle();
            }

            if (priceOfGasPerGallon > 2.00M)
            {
                return new Car();
            }

            return new PickupTruck();
        }
    }



public class TripControllerOldFactoryVersion
{
    public decimal PriceOfGasPerGallon { get; set; }

    public TripControllerOldFactoryVersion(decimal priceOfGas)
    {
        this.PriceOfGasPerGallon = priceOfGas;
    }
    public void TakeATrip()
    {
        IVehicle v = VehicleFactory.GetAConcreteVehicle(this.PriceOfGasPerGallon);
        v.MakeTrip();
    }
}

}




    class Program
    {
        static void Main(string[] args)
        {

            try
            {
                TripControllerOldFactoryVersion controller1 = new TripControllerOldFactoryVersion(5.00M);
                controller1.TakeATrip();

                TripControllerOldFactoryVersion controller2 = new TripControllerOldFactoryVersion(3.33M);
                controller2.TakeATrip();

                TripControllerOldFactoryVersion controller3 = new TripControllerOldFactoryVersion(0.99M);
                controller3.TakeATrip();

            }
            catch (Exception ex)
            {

                Exception exc = ex;
                while (null != exc)
                {
                    Console.WriteLine(exc.Message);
                    exc = exc.InnerException;
                }
            }
            finally
            {
                Console.WriteLine("Press ENTER to Exit");
                Console.ReadLine();
            }

        }
}

上記は工場出荷時のバージョンです。

だから私はこれをIoCに変換する最善の方法を見つけようとしていますが、IVehicleを決定するための「ガスの価格に基づく」ロジックがまだあります。

スターターコードは以下です。

public class TripControllerIoCVersion
{
    public IVehicle TheVehicle { get; set; }

    public TripControllerIoCVersion(IVehicle v)
    {
        this.TheVehicle = v;
    }
    public void TakeATrip()
    {
        if (null != this.TheVehicle)
        {
            this.TheVehicle.MakeTrip();
        }
    }
}
4

1 に答える 1

1

良い。私は何かを考え出した。まだまだ考える必要があります。ハードコーディングされた「キー」名は好きではありません。しかし、それは機能します。

上記のコードはまだ必要ですが、「工場」を以下に変更しました。

まずはユニティ構成。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>

  <unity>
    <container>

      <register type="MyProjectName.IVehicle, MyProjectName" mapTo="MyProjectName.Bicycle, MyProjectName" name="myBicycleKey" />
      <register type="MyProjectName.IVehicle, MyProjectName" mapTo="MyProjectName.Car, MyProjectName" name="myCarKey" />
      <register type="MyProjectName.IVehicle, MyProjectName" mapTo="MyProjectName.PickupTruck, MyProjectName" name="myPickupTruckKey" />

    </container>
  </unity>

</configuration>

次にcsコード。

public static class VehicleFactory
{

    public static IVehicle GetAConcreteVehicle(decimal priceOfGasPerGallon)
    {

        var container = new UnityContainer();

        UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
        section.Configure(container);

        IVehicle v = null;

        if (priceOfGasPerGallon > 4.00M)
        {
            v = container.Resolve<IVehicle>("myBicycleKey");
            return v;
        }

        if (priceOfGasPerGallon > 2.00M)
        {
            v = container.Resolve<IVehicle>("myCarKey");
            return v;
        }

        v = container.Resolve<IVehicle>("myPickupTruckKey");
        return v;

    }
}

私はここからアイデアを得たと思います:

http://www.sharpfellows.com/post/Unity-IoC-Container-.aspx

于 2013-02-05T22:01:22.463 に答える