1

J'ai une méthode d'aide statique dans mon application ASP.NET MVC. Voici un exemple de code qui illustre le problème (le code réel est un peu plus complexe). S'il vous plaît se concentrer sur le modèle. Le code réel n'interagit pas avec une base de données.Méthodes statiques et le localisateur de service

Le code ci-dessous est extrait pour permettre les tests unitaires. Le problème que j'ai est d'obtenir l'implémentation concrète pour IDatabaseManager. L'utilisation d'un localisateur de service est-elle mauvaise? Des recommandations sur les bonnes pratiques? J'ai lu que les localisateurs de service sont l'anti-pattern. S'il vous plaît donnez votre avis. Tous les autres endroits dans le code utilisent l'injection de dépendance (le problème ici est évidemment la méthode statique DataWriter).

public static class DataWriter { 
    public static void WriteDate() { 
     var datetime = DateTime.Now.ToString(); 

     //Is this service locator a bad pattern? 
     var databaseManager = StructureMap.ObjectFactory.Container.GetInstance<IDatabaseManager>(); 
     var dataRepository = new DataRepository(databaseManager); 

     dataRepository.Write(datetime); 
    } 
} 

public class DatabaseManager : IDatabaseManager { 
    public void Write(string s) { 
     //Write to database 
    } 
    //Other methods 
    ... 
    ... 
} 

public interface IDatabaseManager { 
    void Write(string s); 
    //Other signatures 
    ... 
    ... 
} 

public class DataRepository : IDataRepository { 
    private IDatabaseManager _databaseManager; 
    public DataRepository(IDatabaseManager databaseManager) { 
     _databaseManager = databaseManager; 
    } 

    public void Write(string data) { 
     _databaseManager.Write(data); 
    } 
} 

public interface IDataRepository { 
    void Write(string data); 
} 

Édition selon les recommandations d'Alex. Modification à nouveau pour supprimer les informations sur cshtml (comme ce n'est pas l'objet de la question)

+0

* * d'écriture à la base de données de CSHTML si controversé que je ne vous inquiétez pas sur l'utilisation des services de localisation en plus de lui. Note secondaire: vous voudrez peut-être reformuler votre question (peut-être que vous voulez dire "devrais-je utiliser le localisateur de service", car il est clair que votre échantillon l'utilise). –

+0

La question ne concerne pas l'écriture dans la base de données. Le code actuel n'écrit pas ou n'interagit pas avec la base de données. C'est un pseudo code pour démontrer le problème. Encore une fois, ma question est que j'utilise un localisateur de service, mais devrais-je l'utiliser en premier lieu. Je demande des recommandations sur les raisons pour lesquelles c'est mauvais. – rkrauter

Répondre

2

J'ai lu que localisateurs de service sont les anti-modèle

Peut-être pas à 100%, mais ils devrait être découragé. Mark Seemann explique que Service Locator is an Anti-Pattern. Je pense que vous devriez regarder Dependency Injection.

Le problème que vous rencontrez est que la résolution de dépendance est intrinsèquement difficile avec les méthodes statiques.

Je vous suggérerais de vous intéresser à l'implémentation de méthodes non statiques et d'injection de dépendances provenant d'autres applications de votre application. Comme Alexei a souligné, appelant les choses d'un Voir n'est pas idéal.

ASP.NET MVC 4 Dependency Injection

+0

Merci pour la réponse. On dirait que c'est la clé. Je devrais éviter les méthodes statiques et utiliser l'injection de dépendance d'ailleurs. – rkrauter