По сути, я хочу, чтобы служба NotificationService получала уникальный идентификатор, предоставленный импортирующим классом, всякий раз, когда он создается и объединяется с новым классом
Вы можете добавить идентификатор (ифакт, что он должен быть инициализирован) к INotificationsService
контракту:
public interface INotificationsService : IObservable<ReceivedNotification>
{
/// <summary>
/// Gets or sets the ID for this notification service. May only be set once.
/// </summary>
/// <exception cref="InvalidOperationException">
/// The setter was called more than once, or the getter was called before the
/// ID was initialized.
/// </exception>
string ID { get; set; }
void IssueNotifications(IEnumerable<ClientIssuedNotification> notifications);
}
Импорт может выглядеть так:
public class Client
{
private readonly INotificationsService _notificationsService;
[Import(typeof(INotificationService),
RequiredCreationPolicy = CreationPolicy.NonShared)]
public INotificationsService NotificationsService
{
get
{
return _notificationsService;
}
set
{
_notificationsService = value;
_notificationsService.ID = "SomeID";
}
}
}
Другой вариант - импортировать фабрику, которая принимаетпараметр ID:
public interface INotificationsServiceFactory
{
INotificationsService Create(string ID);
}
Оба подхода имеют свои сильные и слабые стороны.Например, подход инициализации при импорте является простым, но он вводит дополнительную фазу в сроке жизни компонентов («создан, но еще не инициализирован»).
Фабричный подход избегает этого, но затеняет тот факт, что вам нужен только один экземпляр.Если требуется очистка, заводской подход также переносит ответственность за утилизацию вещей из контейнера на заводского клиента.
Еще одним вариантом является переключение с MEF на другой контейнер IoC, который дает вам более точный контроль регистрации компонентов и разрешения зависимостей, например Castle Windsor.Но тогда вам, конечно, придется поддерживать конфигурацию, что может быть проблемой.