Autofac Resolve 按类型使用委托工厂
Autofac Resolve using delegate factory by type
我在我的项目中将 Autofac 用于 IoC。由于一些遗留软件库,我必须将一些无法解析的服务传递给控制器,并且必须作为参数传递。
我使用这样的委托工厂制作了一个通用控件:
public MyClass<TController, TInterface> {
private delegate TController ControllerFactory(TInterface service);
protected TController _myController;
protected TController Controller {
get
{
return _controller
?? (_controller = ServiceLocator.Resolve<ControllerFactory>()
.Invoke(this);
}
}
}
这很完美,但为了让它工作,我需要控制器的服务参数名称和委托服务参数名称相同,因为正如我所读,Autofac 将参数按名称配对!!
我看到您可以通过使用通用 Func<> 类型注册 class 来完成此操作,但是由于遗留应用程序我需要保留 "clean" 注册,即:
containerBuilder.RegisterType<MyController>();
有谁知道是否可以让委托按类型匹配参数??
Autofac 比大多数 DI 容器更具体地说明您将控制器注册为哪种类型。如果您在控制器的注册中包含 .AsSelf()
,它只会按类型解析类型。这是我们在项目中用于注册 MVC 控制器的模块。
public class MvcModule
: Module
{
protected override void Load(ContainerBuilder builder)
{
var currentAssembly = typeof(MvcModule).Assembly;
builder.RegisterAssemblyTypes(currentAssembly)
.Where(t => typeof(IController).IsAssignableFrom(t))
.AsImplementedInterfaces()
.AsSelf()
.InstancePerDependency();
}
}
使用此注册,您可以按控制器类型解析每个控制器。
var type = typeof(HomeController);
var controller = container.Resolve(type);
Does anyone know if it's possible to make the delegate match the parameter by type??
是的,您可以使用预定义的委托。请参阅动态实例化部分 here。
这是一个简单的例子:
public class ComponentFactory
{
private readonly Func<Dependency, Component> _componentFactory;
public ComponentFactory(Func<Dependency, Component> componentFactory)
{
_componentFactory = componentFactory;
}
public Component Create(Dependency dependency)
{
return _componentFactory(dependency);
}
}
public class Component
{
private readonly Dependency _dependency;
public Component(Dependency dependency)
{
_dependency = dependency;
}
}
public class Dependency
{
}
注册 + 使用
var builder= new ContainerBuilder();
builder.RegisterType<ComponentFactory>();
builder.RegisterType<Component>();
builder.RegisterType<Dependency>();
var container = builder.Build();
var factory = container.Resolve<ComponentFactory>();
//Usage with typed parameters
var component = factory.Create(new Dependency());
**请注意,如果您使用此方法,如果您尝试添加相同类型的参数,Autofac 会抛出异常。前任。 Component
对 Dependency
有两个依赖项
异常看起来像这样:
The input parameter type list
has duplicate types. Try registering a custom delegate type instead of
using a generic Func relationship.
我在我的项目中将 Autofac 用于 IoC。由于一些遗留软件库,我必须将一些无法解析的服务传递给控制器,并且必须作为参数传递。
我使用这样的委托工厂制作了一个通用控件:
public MyClass<TController, TInterface> {
private delegate TController ControllerFactory(TInterface service);
protected TController _myController;
protected TController Controller {
get
{
return _controller
?? (_controller = ServiceLocator.Resolve<ControllerFactory>()
.Invoke(this);
}
}
}
这很完美,但为了让它工作,我需要控制器的服务参数名称和委托服务参数名称相同,因为正如我所读,Autofac 将参数按名称配对!!
我看到您可以通过使用通用 Func<> 类型注册 class 来完成此操作,但是由于遗留应用程序我需要保留 "clean" 注册,即:
containerBuilder.RegisterType<MyController>();
有谁知道是否可以让委托按类型匹配参数??
Autofac 比大多数 DI 容器更具体地说明您将控制器注册为哪种类型。如果您在控制器的注册中包含 .AsSelf()
,它只会按类型解析类型。这是我们在项目中用于注册 MVC 控制器的模块。
public class MvcModule
: Module
{
protected override void Load(ContainerBuilder builder)
{
var currentAssembly = typeof(MvcModule).Assembly;
builder.RegisterAssemblyTypes(currentAssembly)
.Where(t => typeof(IController).IsAssignableFrom(t))
.AsImplementedInterfaces()
.AsSelf()
.InstancePerDependency();
}
}
使用此注册,您可以按控制器类型解析每个控制器。
var type = typeof(HomeController);
var controller = container.Resolve(type);
Does anyone know if it's possible to make the delegate match the parameter by type??
是的,您可以使用预定义的委托。请参阅动态实例化部分 here。
这是一个简单的例子:
public class ComponentFactory
{
private readonly Func<Dependency, Component> _componentFactory;
public ComponentFactory(Func<Dependency, Component> componentFactory)
{
_componentFactory = componentFactory;
}
public Component Create(Dependency dependency)
{
return _componentFactory(dependency);
}
}
public class Component
{
private readonly Dependency _dependency;
public Component(Dependency dependency)
{
_dependency = dependency;
}
}
public class Dependency
{
}
注册 + 使用
var builder= new ContainerBuilder();
builder.RegisterType<ComponentFactory>();
builder.RegisterType<Component>();
builder.RegisterType<Dependency>();
var container = builder.Build();
var factory = container.Resolve<ComponentFactory>();
//Usage with typed parameters
var component = factory.Create(new Dependency());
**请注意,如果您使用此方法,如果您尝试添加相同类型的参数,Autofac 会抛出异常。前任。 Component
对 Dependency
异常看起来像这样:
The input parameter type list has duplicate types. Try registering a custom delegate type instead of using a generic Func relationship.