Click or drag to resize

MetadataFilterAttribute Class

Provides an annotation to filter constructor dependencies according to their specified metadata.
Inheritance Hierarchy

Namespace:  Autofac.Features.AttributeFilters
Assembly:  Autofac (in Autofac.dll) Version: 6.0.0+39696a967e8826f7f1ebc8c1ff4523c9dd75abe0
Syntax
public sealed class MetadataFilterAttribute : ParameterFilterAttribute

The MetadataFilterAttribute type exposes the following members.

Constructors
  NameDescription
Public methodMetadataFilterAttribute
Initializes a new instance of the MetadataFilterAttribute class.
Top
Properties
  NameDescription
Public propertyKey
Gets the key the dependency is expected to have to satisfy the parameter.
Public propertyTypeId
When implemented in a derived class, gets a unique identifier for this Attribute.
(Inherited from Attribute.)
Public propertyValue
Gets the value the dependency is expected to have to satisfy the parameter.
Top
Methods
  NameDescription
Public methodCanResolveParameter
Checks a constructor parameter can be resolved based on metadata requirements.
(Overrides ParameterFilterAttributeCanResolveParameter(ParameterInfo, IComponentContext).)
Public methodEquals
Returns a value that indicates whether this instance is equal to a specified object.
(Inherited from Attribute.)
Protected methodFinalize
Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
(Inherited from Object.)
Public methodGetHashCode
Returns the hash code for this instance.
(Inherited from Attribute.)
Public methodGetType
Gets the Type of the current instance.
(Inherited from Object.)
Public methodIsDefaultAttribute
When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.
(Inherited from Attribute.)
Public methodMatch
When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.
(Inherited from Attribute.)
Protected methodMemberwiseClone
Creates a shallow copy of the current Object.
(Inherited from Object.)
Public methodResolveParameter
Resolves a constructor parameter based on metadata requirements.
(Overrides ParameterFilterAttributeResolveParameter(ParameterInfo, IComponentContext).)
Public methodToString
Returns a string that represents the current object.
(Inherited from Object.)
Top
Explicit Interface Implementations
  NameDescription
Explicit interface implementationPrivate method_AttributeGetIDsOfNames
Maps a set of names to a corresponding set of dispatch identifiers.
(Inherited from Attribute.)
Explicit interface implementationPrivate method_AttributeGetTypeInfo
Retrieves the type information for an object, which can be used to get the type information for an interface.
(Inherited from Attribute.)
Explicit interface implementationPrivate method_AttributeGetTypeInfoCount
Retrieves the number of type information interfaces that an object provides (either 0 or 1).
(Inherited from Attribute.)
Explicit interface implementationPrivate method_AttributeInvoke
Provides access to properties and methods exposed by an object.
(Inherited from Attribute.)
Top
Remarks

This attribute allows constructor dependencies to be filtered by metadata. By marking your dependencies with this attribute and associating an attribute filter with your type registration, you can be selective about which service registration should be used to provide the dependency.

Examples

A simple example might be registration of a specific logger type to be used by a class. If many loggers are registered with the LoggerName metadata, the consumer can simply specify the filter as an attribute to the constructor parameter.

C#
public class Manager
{
  public Manager([MetadataFilter("LoggerName", "Manager")] ILogger logger)
  {
    // ...
  }
}

The same thing can be done for enumerable:

C#
public class SolutionExplorer
{
  public SolutionExplorer(
    [MetadataFilter("Target", "Solution")] IEnumerable<IAdapter> adapters,
    [MetadataFilter("LoggerName", "Solution")] ILogger logger)
  {
    Adapters = adapters.ToList();
    Logger = logger;
  }
}

When registering your components, the associated metadata on the dependencies will be used. Be sure to specify the WithAttributeFilteringTLimit, TReflectionActivatorData, TRegistrationStyle(IRegistrationBuilderTLimit, TReflectionActivatorData, TRegistrationStyle) extension on the type with the filtered constructor parameters.

C#
var builder = new ContainerBuilder();

// Attach metadata to the components getting filtered
builder.RegisterType<ConsoleLogger>().WithMetadata("LoggerName", "Solution").As<ILogger>();
builder.RegisterType<FileLogger>().WithMetadata("LoggerName", "Other").As<ILogger>();

// Attach the filtering behavior to the component with the constructor
builder.RegisterType<SolutionExplorer>().WithAttributeFiltering();

var container = builder.Build();

// The resolved instance will have the appropriate services in place
var explorer = container.Resolve<SolutionExplorer>();
See Also