安装Autofac.Extensions.DependencyInjection包
在programe.cs下
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
//改用Autofac来实现依赖注入
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseStartup<Startup>();
主要是这句代码
//改用Autofac来实现依赖注入
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
在StartUp中增加
//autofac 新增
public void ConfigureContainer(ContainerBuilder builder)
//直接用Autofac注册我们自定义的
//builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope().AsImplementedInterfaces();
builder.RegisterModule(new AutofacConfig());
我的AutofacConfig类如下
public class AutofacConfig : Autofac.Module {
protected override void Load(ContainerBuilder builder) {
//base.Load(builder);
//重写Autofac管道中的Load方法,在这里注入注册的内容
//builder.RegisterType<ServiceA>().As<IServiceA>().InstancePerLifetimeScope();
//以程序集形式注册
//获取以My开头的dll程序集的集合利用Directory.GetFiles获取dll,利用Assembly.LoadFrom委托select来对刚才的每个dll文件进行获取集合
Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "My*.dll").Select(Assembly.LoadFrom).ToArray();
//注册所有实现了 IDependency 接口的类型
Type baseType = typeof(IDependency);
builder.RegisterAssemblyTypes(assemblies)
.Where(b => !b.IsAbstract && baseType.IsAssignableFrom(b))//IsAssignableFrom是否实现了基类的接口这里指的是IDependency
.AsSelf().AsImplementedInterfaces().PropertiesAutowired().InstancePerLifetimeScope();
//Castle AOP
builder.Register(c => new TranscationAop());
//注册AspectCore
builder.RegisterDynamicProxy();
//builder.RegisterType<DocTypeCache>().AsImplementedInterfaces().Named<ICacheData>("DocTypeCache").PropertiesAutowired().InstancePerLifetimeScope().EnableInterfaceInterceptors();
builder.RegisterType<DepCache>().AsImplementedInterfaces().Named<ICacheData>("DepCache").PropertiesAutowired().InstancePerLifetimeScope().EnableInterfaceInterceptors();
builder.RegisterType<UserCache>().AsImplementedInterfaces().Named<ICacheData>("UserCache").PropertiesAutowired().InstancePerLifetimeScope().EnableInterfaceInterceptors();
//注册系统所有Controller,由Autofac创建
//var IControllerType = typeof(ControllerBase);
//builder.RegisterAssemblyTypes(assemblies).Where(t =>
// IControllerType.IsAssignableFrom(t) && t != IControllerType).PropertiesAutowired();
// var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
//.Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
// builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
// builder.RegisterType<SysMenuService>().As<ISysMenuService>().PropertiesAutowired().InstancePerLifetimeScope();
//注册所有控制器
//autofac来实现属性注入
var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
.Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
如果要属性注入则在StartUp中 public void ConfigureServices(IServiceCollection services)
加入
services.AddControllersAsServices() //use by property DI
安装Autofac.Extensions.DependencyInjection包在programe.cs下 public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) //改用Autofac来实现依赖注入 .UseServiceProviderFactory(n
Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个。它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成。主要优点如下(此段描述为转载):
它是C#语言联系很紧密,也就是说C#里的很多编程方式都可以为Autofac使用,例如可以用Lambda表达式注册组件
较低的学习曲线,学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们
XML配置支持
微软的Orchad开源程序使用的就是Autofac,从该源码可以看出
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuild
#### 1. 在Program.cs添加Autofac服务提供工厂
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.Configu...
.
Net core 3.+
使用 Autofac 完成自动注册
public void ConfigureServices(IServiceCollection services)
services.AddHttpContextAccessor();
services.AddControllers()
前情提要:Asp.Net Core内置DI只支持构造函数契约模式接口抽象去推给容器让框架去注入实例化对象。
解释说明:我理解这其实是框架有意为之,目的就是为了让服务定位明确还有边界分明
如果使用服务定位模式(反模式)或者 属性注入,程序集注入,最大不同的一点就是 定位模糊,要么批量要么注入一个提供者自己在注册
服务定位模式(反模式)
生活示例: 我想吃鱼,告诉框架,给我鱼吃,然后内置DI 在容器先实例化一个 提供者极为鱼竿,然后用鱼竿钓鱼给到你。
服务定位模式就是,我想吃鱼,告诉框架,给我鱼竿我要钓鱼,然
原有core 3.1内置了ioc容器和DI注入,有个缺点就算不能够实现AOP,所以使用第三方autofact来代替原有的容器
一:原有core 3.1的容器使用方法
public void ConfigureServices(IServiceCollection services)
services.AddSession();
services.AddContro...
好的,我可以帮你回答这个问题。下面是使用 Autofac 进行依赖注入的步骤:
1. 在 .NET Core 3.1 的项目中,首先需要安装 Autofac 的 NuGet 包。可以使用 Visual Studio 的 NuGet 包管理器或者使用命令行工具来进行安装。
2. 在应用程序的启动类中,需要创建一个 Autofac 的容器。可以使用以下代码来创建一个容器:
```csharp
var builder = new ContainerBuilder();
3. 注册需要进行依赖注入的服务。可以使用以下代码将一个服务注册到容器中:
```csharp
builder.RegisterType<MyService>().As<IMyService>();
上面的代码将 MyService 类注册为 IMyService 接口的实现。
4. 注册控制器。可以使用以下代码将控制器注册到容器中:
```csharp
builder.RegisterControllers(typeof(Startup).Assembly);
上面的代码将应用程序中所有的控制器注册到容器中。
5. 构建容器。可以使用以下代码来构建容器:
```csharp
var container = builder.Build();
6. 在应用程序中使用依赖注入。可以使用以下代码从容器中获取一个服务:
```csharp
var service = container.Resolve<IMyService>();
上面的代码将从容器中获取 IMyService 接口的实现。
以上就是使用 Autofac 进行依赖注入的基本步骤。当然,在实际的应用程序中,可能还需要进行一些高级的配置和使用。
VS调试出现解决 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题
12426