为所有通用存储库注册所有依赖项注入

本文关键字:依赖 注入 注册 存储 | 更新日期: 2023-09-27 18:25:27

我有太多的DAL类,我需要为通用存储库注册依赖项注入。

类示例:

[CollectionName("RenameMe")]
public class Test{
    [BsonId]
    public ObjectId ID { get; set; }
    [BsonElement("u")]
    public Guid UserID { get; set; }
}

通用类示例:

public class GenericRepository<T, ID> : IGenericRepository<T, ID>
{
    public virtual T Save(T pobject)
    {
        _repository.Save(pobject);
        return pobject;
    }
}

当我手动注册时,我确实喜欢:

container.Register<IGenericRepository<DAL.Product, Guid>, GenericRepository<DAL.Product, Guid>>();

我如何为DAL命名空间中的每个类自动创建这个,ofc具有CollectionName属性:

private Container RegisterDAL(Container container)
{
    var classes = 
        from t in Assembly.GetExecutingAssembly().GetTypes()
        where t.Namespace != null
        where t.IsClass
        where t.Namespace.StartsWith("DAL")
        where t.CustomAttributes
            .Any(i => i.GetType() == typeof(CollectionNameAttribute))
        select t;
    foreach (var dalClass in classes)
    {
        var idType = dalClass.CustomAttributes.First(
            p => p.AttributeType == typeof(BsonIdAttribute));
        // what to fill in in the question marks?
        container.Register<IGenericRepository<?, ?>, GenericRepository<?,?>>();
    }
    return container;
} 

为所有通用存储库注册所有依赖项注入

您可以创建一个开放的通用映射:

// using SimpleInjector.Extensions;
container.RegisterOpenGeneric(
    typeof(IGenericRepository<,>),
    typeof(GenericRepository<,>));

RegisterOpenGeneric扩展方法位于核心库的SimpleInjector.Extensions命名空间中。

那将很好地解决你的问题。