Wow, ne peut pas croire que Joel serait en faveur de cette:
var svc = new ShippingService(new ProductLocator(),
new PricingService(), new InventoryService(),
new TrackingRepository(new ConfigProvider()),
new Logger(new EmailLogger(new ConfigProvider())));
au cours de cette:
var svc = IoC.Resolve<IShippingService>();
Beaucoup de gens ne réalisent pas que vos dépendances de la chaîne peut devenir imbriqués, et il devient rapidement lourd à câbler manuellement. Même avec des usines, de la duplication de code est juste pas la peine.
Cio de conteneurs peut être complexe, oui. Mais pour ce cas simple, j'ai montré qu'il est incroyablement facile.
Edit: ok, nous allons justifier encore davantage. Disons que vous avez certaines entités ou objets de modèle que vous souhaitez lier à une puce d'INTERFACE utilisateur. Cette puce d'INTERFACE utilisateur (que nous appellerons Shindows Morms) vous veut implémenter INotifyPropertyChanged afin qu'elle puisse faire le suivi des modifications et mise à jour de l'INTERFACE utilisateur en conséquence.
"OK, ce n'est pas dur" afin de commencer à écrire.
Vous commencez avec ceci:
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime CustomerSince { get; set; }
public string Status { get; set; }
}
..et à la fin jusqu'à ce:
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;
}
C'est dégoûtant code de la plomberie, et je maintiens que si vous écrivez du code tel qu'il est par la main que vous avez volé à partir de votre client. Il y a mieux, plus intelligemment à la façon de travailler.
Jamais entendu parler de ce terme, de travailler plus intelligemment, pas plus fort?
Eh bien imaginez un gars intelligent sur votre équipe est venue et a dit: "Voici un moyen plus facile"
Si vous faites vos propriétés virtuel (calmez-vous, ce n'est pas que les grandes d'un accord), alors nous pouvons tisser dans ce comportement de la propriété automatiquement. (Cela s'appelle de l'AOP, mais ne vous inquiétez pas le nom, se concentrer sur ce qu'il va faire pour vous)
Selon le Cio de l'outil que vous utilisez, vous pourriez faire quelque chose qui ressemble à ceci:
var bindingFriendlyInstance = IoC.Resolve<Customer>(new NotifyPropertyChangedWrapper());
Pouf! L'ensemble de ce manuel INotifyPropertyChanged BS est maintenant généré automatiquement pour vous, sur tous les biens virtuels setter de l'objet en question.
Est-ce de la magie? OUI! Si vous pouvez faire confiance au fait que ce code fait son travail, alors vous pouvez en toute sécurité ignorer tout de cette propriété emballage mumbo-jumbo. Vous avez d'affaires des problèmes à résoudre.
Quelques autres utilisations intéressantes de Cio outil pour faire de l'AOP:
- Déclarative & nested transactions de base de données
- Déclarative et imbriquées Unité de travail
- La journalisation
- Pré/Post-conditions (Design by contract)