うわー、ジョエルがこれを支持するとは信じられない:
var svc = new ShippingService(new ProductLocator(),
new PricingService(), new InventoryService(),
new TrackingRepository(new ConfigProvider()),
new Logger(new EmailLogger(new ConfigProvider())));
これ以上:
var svc = IoC.Resolve<IShippingService>();
多くの人々は、依存関係の連鎖が入れ子になる可能性があることに気づいておらず、手動でそれらを結び付けるのは手に負えなくなります。ファクトリがあっても、コードの複製は価値がありません。
はい、IoCコンテナは複雑になる可能性があります。しかし、この単純なケースでは、信じられないほど簡単であることを示しました。
さて、これをさらに正当化しましょう。スマートUIにバインドするエンティティまたはモデルオブジェクトがあるとします。このスマートUI(これをShindows Mormsと呼びます)では、INotifyPropertyChangedを実装して、変更の追跡とそれに応じたUIの更新を行うことができます。
「わかりました、それほど難しく聞こえません」それであなたは書き始めます。
あなたはこれから始めます:
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime CustomerSince { get; set; }
public string Status { get; set; }
}
..andで終わるこの:
public class UglyCustomer : INotifyPropertyChanged
{
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
string oldValue = _firstName;
_firstName = value;
if(oldValue != value)
OnPropertyChanged("FirstName");
}
}
private string _lastName;
public string LastName
{
get { return _lastName; }
set
{
string oldValue = _lastName;
_lastName = value;
if(oldValue != value)
OnPropertyChanged("LastName");
}
}
private DateTime _customerSince;
public DateTime CustomerSince
{
get { return _customerSince; }
set
{
DateTime oldValue = _customerSince;
_customerSince = value;
if(oldValue != value)
OnPropertyChanged("CustomerSince");
}
}
private string _status;
public string Status
{
get { return _status; }
set
{
string oldValue = _status;
_status = value;
if(oldValue != value)
OnPropertyChanged("Status");
}
}
protected virtual void OnPropertyChanged(string property)
{
var propertyChanged = PropertyChanged;
if(propertyChanged != null)
propertyChanged(this, new PropertyChangedEventArgs(property));
}
public event PropertyChangedEventHandler PropertyChanged;
}
これはうんざりするような配管のコードであり、私があなたがそのようなコードを手で書いているなら、あなたはあなたのクライアントから盗んでいると私は主張します。より良い、よりスマートな作業方法があります。
その言葉を聞いたことがありますか?
あなたのチームの賢い人がやって来て言ったと想像してみてください:「ここに簡単な方法があります」
プロパティを仮想化すると(落ち着いて、それほど大きな問題ではありません)、プロパティの動作を自動的に織り込むことができます。(これはAOPと呼ばれますが、名前を気にする必要はありません。あなたのために何をするかに集中してください)
使用しているIoCツールに応じて、次のようなことができます。
var bindingFriendlyInstance = IoC.Resolve<Customer>(new NotifyPropertyChangedWrapper());
ひどい! 問題のオブジェクトのすべての仮想プロパティセッターで、そのすべての手動INotifyPropertyChanged BSが自動的に生成されます。
これは魔法ですか? はい!このコードが機能するという事実を信頼できる場合は、mumbo-jumboをラップするそのプロパティのすべてを安全にスキップできます。解決すべきビジネス上の問題があります。
AOPを実行するためのIoCツールのその他の興味深い使用法:
- 宣言的でネストされたデータベーストランザクション
- 宣言的でネストされた作業ユニット
- ロギング
- 事前/事後条件(契約による設計)