を使用して一般名を持つ具体的なオブジェクトを動的に選択します。exampleは、簡単なオブジェクト階層の登録と解決をSimpleInjector
で示しています。階層内にジェネリックタイプ(Shipper
:contract
)を追加すると、これはどのように解決できますか?シンプルインジェクタ
考慮事項:
contract
はcsv
ファイルとして解析され、彼らは、UPSやフェデックスのための全く異なる場合があります。 UPSとFedExのクラスだけが出荷前に契約書で何を探すべきかを知っています。ビジネスは契約をいつでも更新してフォルダにドロップできるため、契約はCSVから読み込まれます。アプリが契約の変更の結果として開始されるべきではありません。UPSやFedExを通知などの依存関係でテストしたい(コード内ではない)。
この例で使用している
register
とresolve
は間違っていると考えてください。クラス階層のみを考慮する必要があります。
次の部分のコードです:
public Setup()
{
var container = new SimpleInjector.Container();
// TODO: Registration required for two different shippers
container.Register<UPS, IShipper>();
}
public interface IShipper<T>
{
T contact;
void Ship(Product product);
T ParseContract(string fileName);
void SetContract(T);
}
public class FiveYearContract
{
public string IsSigned { get; set; }
}
public class TenYearContract
{
public string IsPrepaid { get; set; }
}
public interface IUPS<T> : IShipper<T> { }
public interface IFedEx<T> : IShipper<T> { }
public class UPS : IUPS<FiveYearContract> { ... }
public class FedEx : IFedEx<TenYearContract> { ... }
使用法:
public void Ship(String shipper, Product product)
{
// TODO: Retrieve the shipper by name
var shipper = container.GetInstance<IShipper>();
shipper.SetContract(shipper.ParseContract("contract.csv");
// Contract will be checked before sending
shipper.Ship(product);
}
Ship("FedEx", new Product());
質問がありません。一般的な 'IShipper'を定義しますが、この例では非汎用的な 'IShipper'インタフェースを解決します。 'IShipper 'は 'IShipper'から継承していますか? –
Steven
2番目の質問:各呼び出しで変更される可能性のある実行時データ、またはアプリケーションが再起動されるまで変更される予定のアプリケーション構成の一部です。 – Steven
@スティーブンポイント3と1を参照してください。 –