2017-10-20 66 views
1

我需要此IService是可重用的。每當IService被注入到構造函數中,我都需要Service.Dependent來引用注入類的類型。獲取對通用類型服務的從屬服務的引用

builder.Register<Service>(c => 
     { 
      var a = new Service(); 
      a.Dependent = c.Resolve<CallingType??>(TypedParameter.From(a)); 
      return a; 
     }).As<IService>(); 

interface IService {} 

class Service : IService { 
    BaseClass Dependent {get; set;} 
} 


class SomeClass : BaseClass { 
    SomeClass(IService service) { 
     service.Dependent //This should be type BaseClass of SomeClass 
    } 
} 

回答

2

Autofac支持open generic registrationcircular dependencies
所以它可以像做:

builder.RegisterGeneric(typeof (Service<>)) 
    .As(typeof (IService<>)) 
    .InstancePerLifetimeScope() 
    .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies); 
builder.RegisterType<SomeClass>() 
    .InstancePerLifetimeScope(); 

而且container.Resolve<IService<SomeClass>>()將返回你的SomeClass注入實例,它會遞歸收到此Service實例服務。

似乎在註冊期間沒有提取被調用者類型的選項。 對於您更新的示例自定義Registration Source可能會有所幫助。
這是繼承自BaseType類型的「通用」註冊。 但它看起來像過度工程。

public class HandlerRegistrationSource : IRegistrationSource 
{ 
    public IEnumerable<IComponentRegistration> RegistrationsFor(
    Service service, 
    Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor) 
    { 
    var swt = service as IServiceWithType; 
    if(swt == null || !typeof(BaseClass).IsAssignableFrom(swt.ServiceType)) 
    { 
     // It's not a request for the BaseClass type, so skip it. 
     return Enumerable.Empty<IComponentRegistration>(); 
    }   
    var registration = new ComponentRegistration(
     Guid.NewGuid(), 
     new DelegateActivator(swt.ServiceType, (c, p) => 
     { 
      var myService = c.Resolve<IService>(); 
      ... 
     } 
     ... 
    } 
    ... 
} 
+0

有沒有辦法做到這一點,我更新的例子。 autofac是否有辦法在註冊時使用反射來引用調用類型? –

+0

@CodyBouche,我已經更新了我的答案。 – Kote

相關問題