2014-02-17 37 views
2

我想基於它們的類屬性註冊和解析動態加載的類型。我的代碼如下:基於類屬性/元數據的Autofac解析

自定義類屬性:

[MetadataAttribute] 
public class FooIdentifier : Attribute 
{ 
    public string Identifier { get; private set; } 

    public FooIdentifier(string identifier) 
    { 
     this.Identifier = identifier; 
    } 
} 

我的抽象基類

public abstract class Base 
{ 
    public abstract bool Execute(object param); 

    public bool Run(object param = null) 
    { 
     //... 
     return true; 
    } 
} 

我實現類型

[FooIdentifier("230")] 
public class Child1 : Base 
{ 
    public override bool Execute(object param) 
    { 
     throw new NotImplementedException(); 
    } 
} 

[FooIdentifier("250")] 
public class Child2 : Base 
{ 
    public override bool Execute(object param) 
    { 
     throw new NotImplementedException(); 
    } 
} 

我不希望有一個硬引用,所以我會手動加載程序集。我的目標是根據class屬性的標識符來解析具體的實現。我已經嘗試了很多與元數據,metadatafrom,鍵等等等等,我現在的嘗試是:

 var builder = new ContainerBuilder(); 
     var assembly = Assembly.LoadFrom(@"[PathToAssembly].dll"); 

     builder.RegisterModule<AttributedMetadataModule>(); 

     builder.RegisterAssemblyTypes(assembly) 
      .Where(t => t.IsSubclassOf(typeof(Base))) 
      //.As<Base>() or .AsImplementedInterfaces() 
      .WithMetadataFrom<TaskIdentifier>(); 

     var container = builder.Build(); 
     var child = test.ResolveKeyed<Base>("230"); // here i want to have child1 

有人可以幫助我?

回答

5
builder.RegisterAssemblyTypes(assembly) 
     .Where(t => t.IsSubclassOf(typeof(Base)) && 
        t.GetCustomAttribute<FooIdentifier>() != null) 
     .Keyed<Base>(t => t.GetCustomAttribute<FooIdentifier>().Identifier);