如何基于Ninject代码的约定来干燥

时间:2014-06-12 11:56:23

标签: c# ninject dry

我有以下绑定代码

 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类型,我想干掉绑定代码,所以我不必复制粘贴它。

1 个答案:

答案 0 :(得分:0)

我可以劫持用于COM互操作的GuidAttribute,而不是在我的类中添加 TypeID 字段。例如

[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());
}

如果我选择但是循环是关键,我可以在扩展方法中包装上面的代码。