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

C# 为所有通用存储库注册所有依赖项注入,c#,asp.net-mvc,dependency-injection,simple-injector,C#,Asp.net Mvc,Dependency Injection,Simple Injector,我有太多的DAL类,我需要为通用存储库注册依赖注入 课堂示例: [CollectionName("RenameMe")] public class Test{ [BsonId] public ObjectId ID { get; set; } [BsonElement("u")] public Guid UserID { get; set; } } public class GenericRepository<T, ID> : IGenericR

我有太多的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;
    }
}
通用类示例:

[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;
    }
}
公共类GenericRepository:IGenericRepository
{
公共虚拟T存储(T对象)
{
_repository.Save(pobject);
返回对象;
}
}
当我手动注册时,我喜欢:

container.Register<IGenericRepository<DAL.Product, Guid>, GenericRepository<DAL.Product, Guid>>();
container.Register();
如何为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;
} 
private Container RegisterDAL(容器容器)
{
变量类=
从Assembly.getExecutionGassembly().GetTypes()中的t开始
其中t.Namespace!=null
t.IsClass在哪里
其中t.Namespace.StartsWith(“DAL”)
其中t.CustomAttributes
.Any(i=>i.GetType()==typeof(CollectionNameAttribute))
选择t;
foreach(类中的类)
{
var idType=dalClass.CustomAttributes.First(
p=>p.AttributeType==typeof(BsonIdAttribute));
//在问号里填什么?
容器。注册>();
}
返回容器;
} 

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

// using SimpleInjector.Extensions;

container.RegisterOpenGeneric(
    typeof(IGenericRepository<,>),
    typeof(GenericRepository<,>));
//使用SimpleInjector.Extensions;
container.RegisterOpenGeneric(
类型(IGenericRepository),
类型(一般保存);
RegisterOpenGeneric
扩展方法位于核心库的
SimpleInjector.Extensions
命名空间中


这将优雅地解决您的问题。

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

// using SimpleInjector.Extensions;

container.RegisterOpenGeneric(
    typeof(IGenericRepository<,>),
    typeof(GenericRepository<,>));
//使用SimpleInjector.Extensions;
container.RegisterOpenGeneric(
类型(IGenericRepository),
类型(一般保存);
RegisterOpenGeneric
扩展方法位于核心库的
SimpleInjector.Extensions
命名空间中


这将很好地解决您的问题。

我使用SimpleInjector,但找不到“RegisterOpenEneric”。另外,我在Im上找不到使用最新2.3版本的“RegisterManyForOpenGeneric”。很抱歉,
RegisterOpenGeneric
SimpleInjector.Extensions
命名空间中的扩展方法。您必须包含该名称空间。哦,SimpleInjector.Extensions是额外的金块包。然而,这解决了我的问题,非常简单:)不,它不再是一个包了。由于v2,dll集成在核心库中。我使用SimpleInjector,我找不到“RegisterOpenEneric”。另外,我在Im上找不到使用最新2.3版本的“RegisterManyForOpenGeneric”。很抱歉,
RegisterOpenGeneric
SimpleInjector.Extensions
命名空间中的扩展方法。您必须包含该名称空间。哦,SimpleInjector.Extensions是额外的金块包。然而,这解决了我的问题,非常简单:)不,它不再是一个包了。自v2以来,dll集成在核心库中。