Autofac使用委托工厂类型来解析
我在我的项目中使用Autofac作为IoC。由于一些传统的软件库,我必须将一些服务传递给无法解析的控制器,并且必须作为参数传递。Autofac使用委托工厂类型来解析
我做了利用委托工厂这样一个普通的控制:
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将参数BY NAME!
我已经看到了你可以通过注册类型与通用的Func键<>类做到这一点,但由于传统的应用程序,我需要离开“干净”的注册,即:
containerBuilder.RegisterType<MyController>();
有谁知道如果可以通过类型使委托匹配参数?
有谁知道是否有可能使通过委托类型的参数匹配?
是的,您可以使用预定义的代理。请参阅动态实例部分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
异常看起来是这样的:
输入参数类型列表 有重复的类型。尝试使用通用Func关系注册自定义委托类型而不是 。
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();
}
}
使用此注册,您可以按控制器类型解析每个控制器。
对不起...也许我没有表达自己很正确。我的问题是与委托工厂解决,而不是与注册本身...我试图做一个“基地”类,将解决通用控制器,但我不想使用任何特殊的注册。当然,控制器将被注册... – 2015-02-17 09:55:20
感谢您的输入...无论如何,由于项目中的架构问题,我无法为了兼容性原因而更改,最终无法实现此解决方案...但我会牢记未来的实施! – 2015-02-20 09:45:19