using System; using System.Collections.Generic; using JD.Collections.Extensions; using JD.Kernel.StaticHelpers; using JD.Reflection.MefImplementations.Metadata; namespace JD.Reflection.MefImplementations.Model { public class ExportDefinition { #region Constants public const string ExportTypeIdentityMetadataKey = "ExportTypeIdentity"; public const string TypeIdentityMetadataKey = "TypeIdentity"; #endregion #region Variables private readonly PartDefinition m_part; private readonly string m_contractName; private readonly IReadOnlyDictionary m_metadata; #endregion #region Constructor static ExportDefinition() { // Some validation Throw.InvalidProgramIf(typeof (ITypeIdentityMetadata).GetProperty(TypeIdentityMetadataKey) == null, "Inconsistent TypeIdentity Key"); } public ExportDefinition(PartDefinition part, string contractName, IDictionary metadata) { Throw.IfNull(part, "part"); Throw.IfEmpty(contractName, "contractName"); m_part = part; m_contractName = contractName; m_metadata = metadata == null ? new Dictionary() : (IReadOnlyDictionary)metadata.AsReadOnly(); } #endregion #region Properties public PartDefinition Part { get { return m_part; } } public string ContractName { get { return m_contractName; } } public IReadOnlyDictionary Metadata { get { return m_metadata; } } public string ExportTypeIdentity { get { object value; m_metadata.TryGetValue(ExportTypeIdentityMetadataKey, out value); return (string)value; } } public string TypeIdentity { get { object value; m_metadata.TryGetValue(TypeIdentityMetadataKey, out value); return (string)value; } } #endregion #region Methods public virtual object CreatePart() { return Activator.CreateInstance(Part.Type); } public override string ToString() { return $"{TypeIdentity} (Contract = {ContractName})"; } #endregion } }