Экземпляр может быть общим для всей жизни. Чтобы избежать каких-либо побочных эффектов, Autofac не сообщает нам, какой компонент запросил активированный компонент.
Кстати, вы можете создать пользовательский параметр, который позаботится о введении всех ваших IServiceContext
. Используя модуль, вы можете добавить этот пользовательский параметр для каждого компонента. Таким образом, вы будете знать, какой тип запрашивал ваш IServiceContext
Этот модуль даст вам доступ к целевому типу при запросе T
.
public class TargetPreparingCallbackModule<T> : Module
{
public TargetPreparingCallbackModule(Func<Type, Parameter> targetPreparing)
{
this._targetPreparing = targetPreparing;
}
private readonly Func<Type, Parameter> _targetPreparing;
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry,
IComponentRegistration registration)
{
registration.Preparing += this.Registration_Preparing;
}
private void Registration_Preparing(object sender, PreparingEventArgs e)
{
var t = e.Component.Activator.LimitType;
e.Parameters = e.Parameters.Union(
new[]
{
new ResolvedParameter(
(p, c) => p.ParameterType == typeof (T),
(p, c) => {
Parameter parameter = this._targetPreparing(t);
T instance = c.Resolve<T>(parameter);
return instance;
})
});
}
}
затем вы можете использовать его так:
builder.RegisterModule(
new TargetPreparingCallbackModule<Foo>(targetType => new NamedParameter("module", targetType.FullName)));
Вы также можете использовать событие Activating
или Activated
цели, если хотите иметь доступ к целевому экземпляру.