1
// -----------------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 // -----------------------------------------------------------------------
5 using System
.ComponentModel
.Composition
.Diagnostics
;
6 using System
.ComponentModel
.Composition
.Hosting
;
7 using System
.ComponentModel
.Composition
.Primitives
;
8 using System
.ComponentModel
.Composition
.ReflectionModel
;
9 using System
.Reflection
;
10 using Microsoft
.Internal
;
12 namespace System
.ComponentModel
.Composition
.AttributedModel
14 internal static class AttributedModelDiscovery
16 public static ComposablePartDefinition
CreatePartDefinitionIfDiscoverable(Type type
, ICompositionElement origin
)
18 AttributedPartCreationInfo creationInfo
= new AttributedPartCreationInfo(type
, null, false, origin
);
19 if (!creationInfo
.IsPartDiscoverable())
24 return new ReflectionComposablePartDefinition(creationInfo
);
27 public static ReflectionComposablePartDefinition
CreatePartDefinition(Type type
, PartCreationPolicyAttribute partCreationPolicy
, bool ignoreConstructorImports
, ICompositionElement origin
)
29 Assumes
.NotNull(type
);
31 AttributedPartCreationInfo creationInfo
= new AttributedPartCreationInfo(type
, partCreationPolicy
, ignoreConstructorImports
, origin
);
33 return new ReflectionComposablePartDefinition(creationInfo
);
36 public static ReflectionComposablePart
CreatePart(object attributedPart
)
38 Assumes
.NotNull(attributedPart
);
40 // If given an instance then we want to pass the default composition options because we treat it as a shared part
41 // TODO: ICompositionElement Give this def an origin indicating that it was added directly to the ComposablePartExportProvider.
43 ReflectionComposablePartDefinition definition
= AttributedModelDiscovery
.CreatePartDefinition(attributedPart
.GetType(), PartCreationPolicyAttribute
.Shared
, true, (ICompositionElement
)null);
45 return new ReflectionComposablePart(definition
, attributedPart
);
48 public static ReflectionParameterImportDefinition
CreateParameterImportDefinition(ParameterInfo parameter
, ICompositionElement origin
)
50 Requires
.NotNull(parameter
, "parameter");
52 ReflectionParameter reflectionParameter
= parameter
.ToReflectionParameter();
53 IAttributedImport attributedImport
= AttributedModelDiscovery
.GetAttributedImport(reflectionParameter
, parameter
);
54 ImportType importType
= new ImportType(reflectionParameter
.ReturnType
, attributedImport
.Cardinality
);
56 if (importType
.IsPartCreator
)
58 return new PartCreatorParameterImportDefinition(
59 new Lazy
<ParameterInfo
>(() => parameter
),
61 new ContractBasedImportDefinition(
62 attributedImport
.GetContractNameFromImport(importType
),
63 attributedImport
.GetTypeIdentityFromImport(importType
),
64 CompositionServices
.GetRequiredMetadata(importType
.MetadataViewType
),
65 attributedImport
.Cardinality
,
68 CreationPolicy
.NonShared
));
72 return new ReflectionParameterImportDefinition(
73 new Lazy
<ParameterInfo
>(() => parameter
),
74 attributedImport
.GetContractNameFromImport(importType
),
75 attributedImport
.GetTypeIdentityFromImport(importType
),
76 CompositionServices
.GetRequiredMetadata(importType
.MetadataViewType
),
77 attributedImport
.Cardinality
,
78 attributedImport
.RequiredCreationPolicy
,
83 public static ReflectionMemberImportDefinition
CreateMemberImportDefinition(MemberInfo member
, ICompositionElement origin
)
85 Requires
.NotNull(member
, "member");
87 ReflectionWritableMember reflectionMember
= member
.ToReflectionWritableMember();
88 IAttributedImport attributedImport
= AttributedModelDiscovery
.GetAttributedImport(reflectionMember
, member
);
89 ImportType importType
= new ImportType(reflectionMember
.ReturnType
, attributedImport
.Cardinality
);
91 if (importType
.IsPartCreator
)
93 return new PartCreatorMemberImportDefinition(
94 new LazyMemberInfo(member
),
96 new ContractBasedImportDefinition(
97 attributedImport
.GetContractNameFromImport(importType
),
98 attributedImport
.GetTypeIdentityFromImport(importType
),
99 CompositionServices
.GetRequiredMetadata(importType
.MetadataViewType
),
100 attributedImport
.Cardinality
,
101 attributedImport
.AllowRecomposition
,
103 CreationPolicy
.NonShared
));
107 return new ReflectionMemberImportDefinition(
108 new LazyMemberInfo(member
),
109 attributedImport
.GetContractNameFromImport(importType
),
110 attributedImport
.GetTypeIdentityFromImport(importType
),
111 CompositionServices
.GetRequiredMetadata(importType
.MetadataViewType
),
112 attributedImport
.Cardinality
,
113 attributedImport
.AllowRecomposition
,
114 attributedImport
.RequiredCreationPolicy
,
119 private static IAttributedImport
GetAttributedImport(ReflectionItem item
, ICustomAttributeProvider attributeProvider
)
121 IAttributedImport
[] imports
= attributeProvider
.GetAttributes
<IAttributedImport
>(false);
123 // For constructor parameters they may not have an ImportAttribute
124 if (imports
.Length
== 0)
126 return new ImportAttribute();
129 if (imports
.Length
> 1)
131 CompositionTrace
.MemberMarkedWithMultipleImportAndImportMany(item
);
134 // Regardless of how many imports, always return the first one