Не лучше ли выразить их как массив уникальных строк (или чисел), представляющих идентификатор клиента?
Например, вы можете определить интерфейс метаданных, например:
public interface ICustomerValidityMetadata
{
string[] ValidCustomers { get; }
}
Который вы могли бы свернуть в атрибут метаданных:
[MetadataAttribute]
public class ExportForCustomerAttribute : ExportAttribute, ICustomerValidityMetadata
{
public ExportForCustomerAttribute(Type type, params string[] customerIds)
: base(type)
{
ValidCustomers = customerIds ?? new string[0];
}
}
Который вы могли бы затем применить как:
[ExportForCustomer(typeof(IModule), "CustomerA", "CustomerB")]
public class SomeModule : IModule { }
И затем вы можете фильтровать:
var modules = container.GetExports<IModule, ICustomerValidityMetadata>()
.Where(l => l.Metadata.ValidCustomers.Contains("CustomerA");
Но, если честно, жесткое кодирование представлений изменяемых объектов - плохая идея, вам действительно нужно динамически выполнять поиск, либо из базы данных, либо из конфигурации, и т. Д. Таким образом, вам нужно только экспортировать некоторые метаданные, представляющие идентификатор модуля, которыйзатем вы можете найти конкретного клиента, чтобы выяснить, можно ли его использовать.
Надеюсь, это поможет.