Comment fonctionne une couche de service pour l'intégrer dans ma référentiel de mise en œuvre?

J'ai créé un POCO de la classe du modèle et un référentiel de la classe qui gère la persistance. Depuis le POCO ne peut pas accéder au dépôt, il y a beaucoup de logique métier tâches dans le référentiel qui ne semble pas juste. De ce que j'ai lu, il semble que j'ai besoin d'un service à la couche qui se trouve entre l'INTERFACE utilisateur des consommateurs et le dépôt de la couche. Ce que je ne suis pas sûr, c'est exactement la façon dont il est censé fonctionner...

En plus de la couche de service, il devrait également être une entreprise distincte de la couche logique, ou est-ce le rôle de la couche de service?

Devrait-il y avoir un seul service par référentiel?

Est la couche de service, le seul moyen que l'INTERFACE utilisateur peut exemple, le modèle d'objets ou de ne le référentiel de fournir à la nouvelle instance du modèle pour le service?

Je dois mettre mes paramètre, le modèle et d'autres validations dans la couche de service que de faire des choses comme la vérification pour s'assurer une entrée est valide et qu'un élément à mettre à jour dans la base de données avant la mise à jour?

Pouvez le modèle référentiel de l'INTERFACE et de tous de faire des appels à la couche de service, ou est-ce juste pour l'INTERFACE utilisateur de consommer?

Est la couche de service censé être toutes les méthodes statiques?

Ce qui serait une manière typique pour appeler le service à la couche de l'INTERFACE utilisateur?

Ce que les validations doivent être sur le modèle vs la couche de service?

Voici un exemple de code pour mes couches existantes:

public class GiftCertificateModel
{
    public int GiftCerticiateId {get;set;}
    public string Code {get;set;}
    public decimal Amount {get;set;}
    public DateTime ExpirationDate {get;set;}

    public bool IsValidCode(){}
}


public class GiftCertificateRepository
{
    //only way to access database
    public GiftCertificateModel GetById(int GiftCertificateId) { }
    public List<GiftCertificateModel> GetMany() { }
    public void Save(GiftCertificateModel gc) { }
    public string GetNewUniqueCode() { //code has to be checked in db }

    public GiftCertificateModel CreateNew()
    {
        GiftCertificateModel gc = new GiftCertificateModel();
        gc.Code = GetNewUniqueCode();
        return gc;
    }              
}

Mise à JOUR:
Je suis actuellement en utilisant des formulaires web et classique ADO.NET. J'ai l'espoir de passer à la MVC et EF4 finalement.

Mise à JOUR: Grand merci à @Lester pour sa grande explication. Je comprends maintenant que j'ai besoin d'ajouter une couche de service pour chacun de mes dépôts. Cette couche sera le SEUL moyen de l'INTERFACE utilisateur ou d'autres services peuvent communiquer avec le dépôt et contient toutes les validations qui ne tiennent pas dans le domaine de l'objet (par exemple, - les validations qui ont besoin d'appeler le repo)

public class GiftCertificateService()
{

    public void Redeem(string code, decimal amount)
    {
        GiftCertificate gc = new GiftCertificate();
        if (!gc.IsValidCode(code))
        {
            throw new ArgumentException("Invalid code");
        }

        if (amount <= 0 || GetRemainingBalance(code) < amount)
        {
            throw new ArgumentException("Invalid amount");
        }

        GiftCertificateRepository gcRepo = new GiftCertificateRepository();
        gcRepo.Redeem(code, amount);
    }

    public decimal GetRemainingBalance(string code)
    {
        GiftCertificate gc = new GiftCertificate();            
        if (!gc.IsValidCode(code))
        {
            throw new ArgumentException("Invalid code");
        }

        GiftCertificateRepository gcRepo = new GiftCertificateRepository();
        gcRepo.GetRemainingBalance(code);
    }

    public SaveNewGC(GiftCertificate gc)
    {
        //validates the gc and calls the repo save method
        //updates the objects new db ID
    }

}

Questions

  1. Dois-je ajouter le même (et peut-être plus) des propriétés pour le service que j'ai sur mon modèle (montant, code, etc) ou dois-je seulement offrir des méthodes qui acceptent GiftCertificate objets et directe des paramètres?

  2. Puis-je créer une instance par défaut de la GiftCertificate entité lorsque le Service constructeur est appelé ou tout simplement en créer de nouveaux selon les besoins (par exemple pour la validation de méthodes dans le service que besoin d'appeler les méthodes de validation dans l'entité? Aussi, même question au sujet de la création d'un référentiel par défaut de l'instance...?

  3. Je sais que je exposer les fonctionnalités de l'opération par l'intermédiaire du service, dois-je également exposer les méthodes de l'entité (par exemple - IsValidCode, etc)?

  4. C'est ok pour l'INTERFACE utilisateur de créer simplement un nouveau GiftCertificate objet directement sans passer par le service (par exemple - pour appeler le paramètre de validation des méthodes de l'entité). Si pas, comment les faire respecter?

  5. Sur la couche d'INTERFACE utilisateur, lorsque je veux créer un nouveau certificat-cadeau, dois-je appeler le modèle/service des validations (comme IsValidExpirationDate, etc) directement à partir de la couche d'INTERFACE utilisateur OU dois-je l'hydrate de l'objet, puis de le transmettre à valider, et ensuite de retour à une sorte de récapitulatif de la validation du retour à l'INTERFACE utilisateur?

Aussi, si je veux Racheter de la couche d'INTERFACE utilisateur, dois-je d'abord appeler le modèle/service de validation des méthodes de l'INTERFACE utilisateur pour donner de la rétroaction d'utilisateur, puis d'appeler la Racheter la méthode qui sera exécutée de la même vérifie une fois encore à l'interne?

Exemple pour appeler le service client pour faire Racheter opération à partir de l'INTERFACE utilisateur:

string redeemCode = RedeemCodeTextBox.Text;

GiftCertificateService gcService = new GiftCertificateService();
GiftCertificate gc = new GiftCertificate(); //do this to call validation methods (should be through service somehow?)

if (!gc.IsValid(redeemCode))
{
    //give error back to user
}

if (gcService.GetRemainingBalance(redeemCode) < amount)
{
    //give error back to user
}

//if no errors
gcService.Redeem(code,amount);

Exemple pour la création d'un nouveau certificat-Cadeau à partir de l'INTERFACE utilisateur:

GiftCertificateService gcService = new GiftCertificateService();
GiftCertificate gc = new GiftCertificate();

if (!gc.IsValidExpDate(inputExpDate))
{
    //give error to user..
}

//if no errors...
gc.Code = gcService.GetNewCode();
gc.Amount = 10M;
gc.ExpirationDate = inputExpDate;
gcService.SaveNewGC(gc);
//method updates the gc with the new id...

Quelque chose sent mauvais sujet de manière GCs sont créés et comment les validations sont séparés entre l'entité/service. L'utilisateur/consommateur ne doit pas être concerné par ce que les validations sont dans la place... des conseils?

InformationsquelleAutor jpshook | 2011-05-26