void IEmployerMemberContactsCommand.ContactMembers(ChannelApp app, IEmployer employer, ProfessionalViews views, ContactMemberMessage messageTemplate)
        {
            var cleaner        = new MemberMessageCleaner();
            var cleanedBody    = cleaner.CleanBody(messageTemplate.Body);
            var cleanedSubject = cleaner.CleanSubject(messageTemplate.Subject);

            // Try to access all the members.

            var accesses = _employerMemberViewsCommand.AccessMembers(app, employer, views, MemberAccessReason.MessageSent);

            // Get the member and the representative if there is one.

            var representativeIds = _memberContactsQuery.GetRepresentativeContacts(from m in views select m.Id);

            // Iterate through them all exercising credits when needed.

            var handlers = MessageCreated;

            foreach (var view in views)
            {
                var viewId           = view.Id;
                var representativeId = representativeIds[view.Id];
                var access           = (from a in accesses where a.MemberId == viewId select a).SingleOrDefault();
                ContactMember(messageTemplate, employer, view, cleanedSubject, cleanedBody, representativeId, access, handlers);
            }
        }
        void IEmployerMemberContactsCommand.RejectMember(IEmployer employer, ProfessionalView view, RejectionMemberMessage messageTemplate)
        {
            var cleaner        = new MemberMessageCleaner();
            var cleanedBody    = cleaner.CleanBody(messageTemplate.Body);
            var cleanedSubject = cleaner.CleanSubject(messageTemplate.Subject);

            // Save the message.
            var handlers         = MessageCreated;
            var representativeId = _memberContactsQuery.GetRepresentativeContact(view.Id);

            ContactMember(messageTemplate, employer, view, cleanedSubject, cleanedBody, representativeId, null, handlers);
        }
        void IEmployerMemberContactsCommand.ContactMember(ChannelApp app, IEmployer employer, ProfessionalView view, ContactMemberMessage messageTemplate)
        {
            var cleaner        = new MemberMessageCleaner();
            var cleanedBody    = cleaner.CleanBody(messageTemplate.Body);
            var cleanedSubject = cleaner.CleanSubject(messageTemplate.Subject);

            // Messages are being sent so exercise a credit.

            var access = _employerMemberViewsCommand.AccessMember(app, employer, view, MemberAccessReason.MessageSent);

            // Save the message.

            if (access != null)
            {
                var handlers         = MessageCreated;
                var representativeId = _memberContactsQuery.GetRepresentativeContact(view.Id);
                ContactMember(messageTemplate, employer, view, cleanedSubject, cleanedBody, representativeId, access, handlers);
            }
        }
        void IEmployerMemberContactsCommand.RejectMembers(IEmployer employer, ProfessionalViews views, RejectionMemberMessage messageTemplate)
        {
            var cleaner        = new MemberMessageCleaner();
            var cleanedBody    = cleaner.CleanBody(messageTemplate.Body);
            var cleanedSubject = cleaner.CleanSubject(messageTemplate.Subject);

            // Get the member and the representative if there is one.

            var representativeIds = _memberContactsQuery.GetRepresentativeContacts(from m in views select m.Id);

            // Iterate through them all exercising credits when needed.

            var handlers = MessageCreated;

            foreach (var view in views)
            {
                var representativeId = representativeIds[view.Id];
                ContactMember(messageTemplate, employer, view, cleanedSubject, cleanedBody, representativeId, null, handlers);
            }
        }