autofac文档:Resolve的参数

AutoFac文档

目录

  1. 开始
  2. Registering components
  3. 控制范围和生命周期
  4. 用模块结构化Autofac
  5. xml配置
  6. 与.net集成
  7. 深入理解Autofac
  8. 指导
  9. 关于
  10. 词汇表

Resolve的参数

当注册或者检索component的时候可以使用参数

传递参数给Resolve

Resolve接受可变长度的参数列表

  var fred = Resolve<Person>(new NamedParameter("name", "Fred"));
 

如果是通过反射注册的,这样做可以自动映射到类中指定对应参数的构造函数。比如:

  class Person
    {
    public Person(string name)
    ...
 

可用的参数类型

Autofac提供几种不同的参数对应策略

  • NamedParameter -像上面那样对应的参数名字
  • TypedParameter -对应到参数的类型(必须是具体的类型)
  • ResolvedParameter 灵活的参数匹配

NamedParameter TypedParameter 只能提供常量参数

从表达式中使用参数

如果Person是使用表达式注册的,可以使用第二个可用的委托参数(IEnumerable类型)来获得参数。

  builder.Register((c, p) => new Person(p.Named<string>("name")));
 

委托工厂

阅读委托工厂来获得一种清晰简洁的创建需要参数的component的方法。

转载于:https://www.cnblogs.com/wolegequ/archive/2012/06/09/2543296.html

### .NET 中使用 IOC 容器进行带泛型的注册 在现代软件开发中,依赖注入 (Dependency Injection, DI) 是实现松耦合和可测试性的关键技术之一。对于支持泛型类型的场景,在.NET环境中可以利用多种IOC容器来简化这一过程。 #### Autofac 实现泛型服务注册 Autofac是一个流行的轻量级IoC容器[^4]。下面展示了一个简单的例子说明如何通过Autofac来进行带有泛型的服务注册: ```csharp using Autofac; public class Program { public static void Main(string[] args){ var builder = new ContainerBuilder(); // 注册所有实现了 IGenericService<T> 接口的具体类 builder.RegisterGeneric(typeof(GenericServiceImpl<>)) .As(typeof(IGenericService<>)); var container = builder.Build(); using(var scope = container.BeginLifetimeScope()){ var serviceForString = scope.Resolve<IGenericService<string>>(); var serviceForInt = scope.Resolve<IGenericService<int>>(); Console.WriteLine(serviceForString.GetType()); Console.WriteLine(serviceForInt.GetType()); } } } // 假设有一个接口定义如下: public interface IGenericService<T>{ } // 和它的具体实现形式像这样: public class GenericServiceImpl<T>: IGenericService<T>{} ``` 这段代码展示了怎样配置`ContainerBuilder`以处理任何给定类型参数T的情况下的`IGenericService<T>`实例化请求。当调用Resolve方法时,它会返回对应于指定类型参数的实际对象实例。 #### ASP.NET Core 的内置 IoC 支持 ASP.NET Core自带了强大的依赖注入功能,并且也提供了对泛型的支持[^3]。这里给出一段基于微软官方文档修改后的示例代码用于解释这一点: ```csharp services.AddScoped(typeof(IRepository<>), typeof(EfCoreRepository<>)); ``` 此行表示每当应用程序需要创建一个特定实体类型的仓储(`IRepository<TEntity>`)时,都会自动提供相应的EF核心库中的持久层组件作为其实现。 以上两种方式都可以很好地满足大多数情况下关于泛型服务注册的需求。当然还有其他第三方库也可以考虑,比如Castle Windsor、StructureMap等,它们各自有着独特的特性和优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值