2014-06-12 35 views
1

我有以下的綁定代碼怎麼幹基於約定的Ninject這段代碼

Kernel 
    .Bind<IWeinCadDocument>() 
    .To<ADocument>().Named(ADocument._TypeId_.ToString()); 
Kernel 
    .Bind<IWeinCadDocument>() 
    .To<BDocument>().Named(BDocument._TypeId_.ToString()); 
Kernel 
    .Bind<IWeinCadDocument>() 
    .To<CDocument>().Named(CDocument._TypeId_.ToString()); 

的想法是,一些數據將需要容器的TYPEID進行序列化被修建安置它。每個班級都有一個靜態字段Guid _TypeId_。這意味着我可以通過Guid獲得正確類型的新文檔;

Guid id = data.TypeId; 
var container = Kernel.Get<IWeinCadDocument>(id); 
container.SetData(data); 

我有許多IWeinCadDocument類型,我想幹掉綁定代碼,所以我不必複製粘貼它。

回答

0

而不是將TypeID字段添加到我的類中,我可以只是劫持用於COM互操作的GuidAttribute。例如

[Guid("4882176A-751A-4153-928A-915BEA87FAB3")] 
public class ADocument : WeinCadDocumentBase<ADocument> 
{ 
    public ADocument(IWeinCadDocumentStorage storage) 
     : base(storage) 
    { 
    } 
    public override object PersistentData 
    { 
     get 
     { 
      return new DocumentData(10, 20); 
     } 
    } 
} 

var documentTypes = new[] 
    { 
     typeof (ADocument), typeof (BDocument), typeof (CDocument) 
    }; 

foreach (var documentType in documentTypes) 
{ 
    Kernel.Bind<IWeinCadDocument>() 
      .To(documentType) 
      .Named(documentType.GUID.ToString()); 
} 

我可以換上面的代碼中的擴展方法,如果我選擇,但環是關鍵。