Autofac:使用非通用接口注册泛型类型

o..*_*..o 6 c# generics interface autofac

我正在尝试注册(作为每个请求的实例)泛型类型和非泛型接口.在网上我发现了很多相反的例子,但没有一个.

因此,我有一个这样的类:

public class UnitOfWork<TContext> : IUnitOfWork where TContext : DbContext, new()
Run Code Online (Sandbox Code Playgroud)

泛型类,但非泛型接口.在Autofac中,我试图以这种方式注册:

builder.RegisterGeneric(typeof(UnitOfWork<>)).As<IUnitOfWork>().InstancePerHttpRequest();
Run Code Online (Sandbox Code Playgroud)

但我收到错误: 服务'Namespace.UoW.IUnitOfWork'不是一个开放的泛型类型定义.

当然,因为它不是.但我不知道如何注册.

谢谢.

nem*_*esv 6

只有RegisterGeneric您还拥有通用接口时才需要.

在您的情况下,您只有一个非泛型接口IUnitOfWork,并且只有一个DbContext派生类,因此您可以将您的注册UnitOfWork<Context>作为普通类型注册:

builder.RegisterType<UnitOfWork<Context>>()
       .As<IUnitOfWork>().InstanceP??erHttp??Request();
Run Code Online (Sandbox Code Playgroud)

所以你的任何类型的请求IUnitOfWork都会得到一个UnitOfWork<Context>.

  • 如果您没有通用的 itnerface,例如 `IUnitOfWork&lt;T&gt;` 您可以将第二个注册为第一个 `builder.RegisterType&lt;UnitOfWork&lt;MySecondContex&gt;&gt;().As&lt;IUnitOfWork&gt;().InstanceP‌​erHttp‌ ​Request();` 但是,如果您想单独解决它们,您需要使用 `Named` 或 `Keyed` 进行注册,请参阅文档:http://docs.autofac.org/en/latest/advanced/keyed -services.html (2认同)