2010-04-01 7 views
0

J'utilise LINQ to SQL pour la couche DataAccess. J'ai des objets métier similaires à ce qui se trouve dans la couche d'accès aux données.Modificateurs d'accès - Propriété sur les objets métier - obtention et définition

Le fournisseur de données a reçu le message # 23. Lors de l'instanciation du message, dans le constructeur du message, il obtient MessageType et crée une nouvelle instance de la classe MessageType et remplit les informations MessageType de la base de données.

Par conséquent; Je veux que cela obtienne le nom du messageType du message.

user.Messages[23].MessageType.Name 

Je veux aussi un administrateur de définir le MessageType

user.Messages[23].MessageType = MessageTypes.LoadType(3); 

, mais je ne veux pas l'utilisateur de définir publiquement le MessageType.Name. Mais lorsque je crée une nouvelle instance MessageType, le modificateur d'accès pour la propriété Name est public car je veux le définir à partir d'une classe externe (ma couche d'accès aux données).

Je pourrais changer cela en propriété interne, afin que ma classe puisse y accéder comme une variable publique, et ne pas permettre à mon autre accès d'application de le modifier.

Cela ne semble toujours pas correct car il semble être une propriété publique. Les modificateurs d'accès public dans cette situation sont-ils mauvais? Des conseils ou suggestions seraient appréciés.

Merci.

Répondre

1

Vous pouvez toujours définir votre propriété comme ça:

public MessageType MessageType 
{ 
    get { return this._messageType; } 
    internal set { this._messageType = value; } 
} 

Si c'est ce que vous cherchez, mais il est un peu difficile de ce que vous voulez. Qu'est-ce qu'un "administrateur" qui est autorisé à définir cette propriété? Si cela signifie que la propriété ne doit être définie que dans le code par le même module ou un module "ami", alors c'est la solution.

Une autre façon serait d'exposer publiquement seulement une interface IMessage avec seulement un getter à la MessageType MessageType { get; } pour les modules "public". Dans vos modules de base vous auriez la classe Message complète où vous avez également un setter. Si vous voulez dire par "administrateur" que cela dépend du rôle de l'utilisateur actuel si la propriété peut être définie (dans une interface graphique par exemple), alors il n'y a pas de solution simple qui peut être résolue par un simple accesseur de propriété. Vous devrez le rendre public. Ensuite, vous devrez coder une gestion des droits fantaisie que vous utiliserez pour évaluer si cette partie de l'interface graphique sera activée et que vous utiliserez à nouveau pour valider avant d'enregistrer la valeur dans votre magasin de données.

Questions connexes