使用AnyConcreteTypeNotAlreadyRegisteredSource进行属性连接

时间:2013-01-13 06:11:39

标签: autofac

我使用AnyConcreteTypeNotAlreadyRegisteredSource来注册具体类型。有什么方法可以注入这些类型的属性吗?

感谢。

1 个答案:

答案 0 :(得分:1)

简短回答是

因为默认情况下Autofac不会注入属性,AnyConcreteTypeNotAlreadyRegisteredSource无法配置此属性。

但是,基于original implementation,您可以创建自己的AnyConcreteTypeNotAlreadyRegisteredSourceWithProperties,使用PropertiesAutowired()选项注册组件:

public class AnyConcreteTypeNotAlreadyRegisteredSourceWithProperties 
    : IRegistrationSource
{
    public IEnumerable<IComponentRegistration> RegistrationsFor(
        Service service,
        Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor)
    {
        if (registrationAccessor == null)
        {
            throw new ArgumentNullException("registrationAccessor");
        }
        var ts = service as TypedService;
        if (ts == null ||
            !ts.ServiceType.IsClass ||
            ts.ServiceType.IsSubclassOf(typeof(Delegate)) ||
            ts.ServiceType.IsAbstract ||
            registrationAccessor(service).Any())
            return Enumerable.Empty<IComponentRegistration>();

        return new[] { RegistrationBuilder.ForType(ts.ServiceType)
            .PropertiesAutowired().CreateRegistration() };
    }

    public bool IsAdapterForIndividualComponents
    {
        get { return false; }
    }
}

然后用以下内容注册您的实现:

var builder = new ContainerBuilder();
builder
  .RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSourceWithProperties());