首页 新闻 搜索 专区 学院

.net core mvc中如何注入泛型仓储

0
悬赏园豆:15 [待解决问题]

如题,我在.net core mvc中定义了仓储,但是怎么注入?按照网上方法注入提示失败.

仓储接口

 public interface IRepository<T> where T : Entity
    {//todo}

 

仓储实现 

 public abstract class BaseRepository<T> : IRepository<T> where T : Entity
    {//todo}

 

entity实体

复制代码
 9 
10 
11     /// <summary>
12     /// 泛型实体基类
13     /// </summary>
14     /// <typeparam name="TPrimaryKey">主键类型</typeparam>
15     public abstract class Entity<TPrimaryKey>
16     {
17         /// <summary>
18         /// 主键
19         /// </summary>
20         public virtual TPrimaryKey Id { get; set; }
21     }
22 
23     /// <summary>
24     /// 定义默认主键类型为int的实体基类
25     /// </summary>
26     public abstract class Entity : Entity<int>
27     {
28     }
复制代码

startUp文件注入

 1   public IServiceProvider ConfigureServices(IServiceCollection services)
 2         {
 3             services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
 4             services.AddMvc();
 5             services.AddDbContext<EfDbContext>(options=> {
 6                 options.UseMySql(Configuration.GetConnectionString("Connection"));
 7             },ServiceLifetime.Scoped);
 8 
 9 
10             var builder = new ContainerBuilder();
11             //找到所有Controller的类型
12             var assembly = this.GetType().GetTypeInfo().Assembly;
13             var manager = new ApplicationPartManager();
14             manager.ApplicationParts.Add(new AssemblyPart(assembly));
15             manager.FeatureProviders.Add(new ControllerFeatureProvider());
16             var feature = new ControllerFeature();
17             manager.PopulateFeature(feature);
18             //通过Autofac对Controller类型进行注册
19             builder.RegisterTypes(feature.Controllers.Select(ti => ti.AsType()).ToArray()).PropertiesAutowired();
20             builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IRepository<>)).InstancePerDependency();//注册仓储泛型
21          
22             builder.RegisterType(typeof(UnitOfWork)).As(typeof(IUnitOfWork));//注册工作单元
23             builder.Populate(services);
24             return new AutofacServiceProvider(builder.Build());
25         }

 

报错信息

龙益阳的主页 龙益阳 | 初学一级 | 园豆:136
提问于:2018-07-31 10:51

我的不是抽象的怎么也不行,用的3.1版本

纯洁的逗比 1个月前
< >
分享
所有回答(3)
1

//register

services.AddScoped(typeof(Repository<,>));

//get service

.GetService<Repository<TContext, TEntity>>();

 

autofac怎么写不太清楚。给你参考一下

czd890 | 园豆:11014 (专家六级) | 2018-07-31 11:09
-3

如果使用 .net core 自带的依赖注入容器,可以轻松搞定

dudu | 园豆:37797 (高人七级) | 2018-07-31 11:50

自带的依赖注入容器好像不能进行泛型注入吧,我试了怎么不行

支持(0) 反对(0) 我的个去 | 园豆:200 (初学一级) | 2019-11-21 09:42

@我的个去: 在 .NET Core 3.0 中,下面2种方式都可以注入泛型
方法1:

services.AddSingleton<IMemcachedClient<T>, MemcachedClient<T>>();

方法2:

services.AddSingleton(typeof(IMemcachedClient<>), typeof(MemcachedClient<>));
支持(0) 反对(0) dudu | 园豆:37797 (高人七级) | 2019-11-21 14:49

@dudu: 我试了 用的方法2不得行,报无法实例化,我用的是core 2.2

支持(0) 反对(0) 我的个去 | 园豆:200 (初学一级) | 2019-11-21 14:52

@dudu: 好的 谢谢

支持(0) 反对(0) 我的个去 | 园豆:200 (初学一级) | 2019-11-21 14:53

@我的个去: 如果还是不行,建议在博问中重新发一个提问

支持(0) 反对(0) dudu | 园豆:37797 (高人七级) | 2019-11-21 14:53

@dudu: 可以了 原来实现类不能用abstract ,谢谢哈

支持(1) 反对(0) 我的个去 | 园豆:200 (初学一级) | 2019-11-24 16:52

@我的个去: 哈哈,我也是这个问题

支持(0) 反对(0) uuisn | 园豆:200 (初学一级) | 2020-01-11 21:15
0

兄弟你好,我在.netcore2.2 mvc 中自动注册 autofac 服务,
在startup中执行以下代码,可以完成自动注册服务,
builder.RegisterGeneric(typeof(Service<>)).As(typeof(IService<>)).InstancePerDependency();

private readonly IService<User> _userService;

public HomeController(IService<User> userService)
{
_userService = userService;
}

在如果把泛型类改成多类型泛型就不行了。
builder.RegisterGeneric(typeof(Service<,>)).As(typeof(IService<,>)).InstancePerDependency();

我在控制器中构造函数注入访问引发异常。

private readonly IService<User, Guid> _userService;

public HomeController(IService<User, Guid> userService)
{
_userService = userService;
}
我的QQ号:42807167 期待您的回复。

肆夕 | 园豆:106 (初学一级) | 2019-08-13 13:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册