ว้าวไม่น่าเชื่อว่าโจเอลจะชอบสิ่งนี้:
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; }
}
.. และจบลงด้วยสิ่งนี้ :
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 ได้อย่างปลอดภัย คุณมีปัญหาทางธุรกิจในการแก้ไข
การใช้เครื่องมือ IoC ที่น่าสนใจอื่น ๆ ในการทำ AOP:
- การทำธุรกรรมฐานข้อมูลการประกาศ & ซ้อน
- หน่วยงานประกาศ & ซ้อน
- เข้าสู่ระบบ
- เงื่อนไขก่อน / หลัง (ออกแบบตามสัญญา)