Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将Autofac容器传递给WPF UserControl

将Autofac容器传递给WPF UserControl
EN

Stack Overflow用户
提问于 2012-12-12 10:05:20
回答 2查看 7.3K关注 0票数 3

我正在使用autofac解析WPF应用程序中的视图和ViewModels。IComponentContext将自动传递到视图中。

举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public BusinessAuto(int proposedCoverageId, IComponentContext componentContext)
    {
        DataContext = componentContext.Resolve<BusinessAutoViewModel>(new TypedParameter(typeof(Int32), proposedCoverageId));
        InitializeComponent();
    }

在用于此视图的XAML中,正在创建具有自己的UserControls的ViewModels。举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<userControl:AdditionalCoveragesControl Margin="0,10"/>

Autofac没有创建UserControl (视图是),因此Autofac不能将依赖项注入UserControl的构造函数。

如何将对IComponentContext的引用转换为初始视图的XAML?中声明的UserControl

我觉得我要么需要Autofac来以某种方式创建我的UserControl,要么我需要恢复到气馁的全局静态容器( ick),或者我必须使用一个DependencyProperty来传递容器(也是ick)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-05 01:37:54

我不会注入(实际上是什么)您的容器,因为这是一种称为Service的控制反转的低级形式,其缺陷可以用当前的情况来总结:您最终需要将容器注入到所有东西中。

相反,您需要从“负责创建的组件是什么,以及它需要做什么”的角度来处理这个问题?

正如Lonni所提到的,一种选择是注入一个完全形成的控件,但我不同意这一点:如果主视图负责创建这个子组件,那么它应该创建它--但是为了方便这种责任,您应该将主视图注入服务/模型/等等,然后它需要传递或以其他方式使用来创建它。Autofac的工厂方法存根对此非常理想:

例如,如果子视图需要一个IFooViewModel,您可以向容器注入一个Func

(或者您需要的Func )

一个方便的经验法则是,当考虑到X类时,首先在任何地方“更新”任何内容,然后将其传递给构造函数。现在看看代码,问问自己“如果我想要一个类X的实例,我需要什么来传递构造函数?”这些是你的依赖关系。

让我们使用更多的example...say,您有这样的结构:

  • 应用程序创建MainWindow
  • MainWindow创建SubView1,需要IMainWindowViewModel
  • SubView1需要ISubView1Model,IFooService
  • SubView1创建SubView2
  • SubView2需要ISubView2Model,IBarService

所以我们的领队看起来是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public MainWindow(IMainWindowViewModel viewModel, 
     Func<SubView1> subView1Factory)

public SubView1(ISubView1Model viewModel,
    IFooService fooService,
    Func<IFooService, SubView2> subView2Factory)

public SubView2(
    ISubView2ModelViewModel viewModel, 
    IBarService barService)

在设置容器时,您可能会遇到这样的情况:

(注意,我使用了各种IoC容器,所以我的Autofac语法可能会生锈)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var builder = new ContainerBuilder();

// Simple bit, register implementations for viewmodel, services
builder.RegisterType<MainWindowViewModel>.As<IMainWindowViewModel>();
builder.RegisterType<SubView1Model>.As<ISubView1Model>();
builder.RegisterInstance<FooService>.As<IFooService>();

// ok, lemme see if I can remember expression syntax...

// Simple case: 'static' resolution of subview
// We want a func that takes no args and returns us a fully-initialized
//  SubView1
builder.Register<Func<SubView1>>(context =>
{
    // Since all the bits of a subview1 are registered, simply
    // resolve it and return
    var view = context.Resolve<SubView1>();
    return () => view;
});

// Complicated case - lets say this viewmodel depends
// on foo service, which it uses to determine which 
// bar service to use
builder.Register<Func<IFooService, SubView2>>(context =>
{
    // and our view model
    var vm = context.Resolve<ISubView2ViewModel>();

    return (service) =>
    {
        var barService = new BarService(service);
        return new SubView2(vm, barService);
    };
});

IoC容器的光荣用途(在我看来仅限于此)是“您根据我已经告诉您的内容找到了所有的位元”部分--否则,您最好使用手动注入,即手动传递依赖项。尽管如此,我们对MainWindow的潜在复杂的构建现在只是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
container.Resolve<MainWindow>();

我希望我没有在代码中做太多的输入/错误,但我已经有一段时间没有使用Autofac了。

票数 6
EN

Stack Overflow用户

发布于 2013-01-05 01:21:49

您不应该将componentContext传递给BusinessAuto视图,而应该传递AdditionalCoveragesControl。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public BusinessAuto(int proposedCoverageId, BusinessAutoViewModel vm, AdditionalCoveragesControl view)
{ 
  ...
  DataContext = vm;
  InternalView = view;
}    

XAML:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <ContentPresenter Content="{Binding InternalView}" Margin="0,10"/>

然后您的所有视图都将独立于Autofac,您应该将它们全部注册在容器中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13845903

复制
相关文章
依赖注入容器Autofac
在.NET上现在存在许多的依赖注入容器, 我也在实践中使用过Castle Windsor、StructureMap、Autofac 、Unity。这些容器的简要介绍可以参看: IoC in .NET part 1: Autofac IoC in .NET part2: StructureMap IoC in .NET part 3: Ninject 2 beta IoC in .NET part4: Spring.NET IoC in .NET part 5: Using CastleWindsor con
张善友
2018/01/22
1.2K0
依赖注入容器-- Autofac
Autofac---Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高。
小世界的野孩子
2019/09/11
8380
依赖注入容器-- Autofac
WPF使用自定义控件UserControl
大佬们基本上都在讲怎么自定义控件,却怎么也没有说明怎么使用这些个自定义的控件,然后看完教程的本小白只能干瞪眼..可能大佬们不屑这样基础的东西 首先新建一个用户控件UserControl1.xaml,这个会用几下VS的应该都没有难度。
zls365
2021/10/19
1.9K0
WPF 将控件放入到 UserControl 里获取 HwndSource 为空的情况
本文记录将 WPF 控件放入到 UserControl 里,如果此 UserControl 没有被设置 Visibility 为可见过,那么放在此 UserControl 内的控件将获取不到 HwndSource 内容
林德熙
2022/02/28
1.4K0
wpf使用usercontrol自定义标签
使用模板contenttemplate,重写usercontrol,而不是在usercontrol里面直接加grid等标签,最后uesrcontrol的content通过
sofu456
2021/12/06
5980
AutoFac - 将 autofac 应用于MVC多层项目
  AutoFac是.NET平台下的一款著名的IoC Container,它可以让我们很轻松的解除项目中服务类的接口与客户类的接口实现类之间的依赖关系,从而降低系统各模块之间耦合程度以提高系统的稳定性。最近在做毕业设计,在开发中采用了autofac来进行依赖注入,这里是对踩到的一些坑的解决方法,希望可以给同样不幸进入这些坑中的童鞋们提供一些解决思路。
程序员宇说
2019/09/11
8450
AutoFac - 将 autofac 应用于MVC多层项目
从零开始搭建一个GIS开发小框架(五)——GMap.Net组件WPF版使用体验
现在windows平台的开发越来越流行WPF,我发现GMap.Net也有WPF版本,就跟风尝试了一下,只能说泪流满面,原本在GMap.Net.Winforms版本里使用很方便的方法和属性,在WPF版本里都没有了,很多方法都只能自己硬写代码实现。我计划完成一个WPF版本的Demo(绿色是目前已经完成的功能)。主程序是我以前做的WPF版本万能框子,GMap.Net组件是其中一个UserControl。
天堂向左
2022/12/01
1.2K0
精:.NET 6整合 autofac 依赖注入容器
常看到java的学习资料或博客,标题一般为《SpringBoot 整合 XXX》,所以仿照着写了《.NET 6 整合 Autofac 依赖注入容器》这样一个标题。
郑子铭
2023/08/30
3660
精:.NET 6整合 autofac 依赖注入容器
WPF使用Winform自定义控件
说明:<wfi:WindowsFormsHost></wfi:WindowsFormsHost>即为WinForm控件的宿主容器,每一个宿主容器只能放一个WinForm控件,如下例,放了三个WinForm控件,分别放在三个宿主容器里面,该容器可以设置属性来调整大小和布局
用户7053485
2020/03/12
1.4K0
使用Autofac IOC组织多项目应用程序
较复杂的应用程序都是由多个项目组织成的,项目可以划分成程序集(Assemblies)和宿主(Hosts),也就是应用程序的入口。 Assemblies 通常是常见的类库项目,包括可以重用的功能和方便测试,通常包括下面的组件: Views, Controllers 和 Models 服务 持久类 和 repositories Decorators Reusable user controls 规则库 业务逻辑 这些项目通常不应该直接依赖于下面的组件: IoC 容器程序集; 日志记录框架 ;
张善友
2018/01/19
8500
学习WPF——WPF布局——初识布局容器
StackPanel堆叠布局 StackPanel是简单布局方式之一,可以很方便的进行纵向布局和横向布局 StackPanel默认是纵向布局的 <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWind
liulun
2018/01/12
1.6K0
学习WPF——WPF布局——初识布局容器
学习WPF——WPF布局——了解布局容器
WPF布局工作内部原理 WPF渲染布局时主要执行了两个工作:测量和排列 测量阶段,容器遍历所有子元素,并询问子元素所期望的尺寸 排列阶段,容器在合适的位置放置子元素,并设置元素的最终尺寸 这是
liulun
2018/01/12
2.4K0
学习WPF——WPF布局——了解布局容器
Winform窗口里的嵌入WPF的UserControl,关闭Winform父窗体的方法
可以在form_load事件里把this传给UserControl,然后在usercontrol里调用form的各种方法,不过这种做法不太好,耦合性较高。标准做法是用事件传递 UserControl里加如下代码: public delegate void FormCloseEventHandler(object sender, EventArgs e); public event FormCloseEventHandler FormClose; private void button_quit_Clic
hbbliyong
2018/03/05
2.9K0
winform 、WPF传值方式详解
1.构造函数 2.静态变量 3.增加窗体属性 public string name{set;get;} 例如: public partial class Window1 : Window { public string name { get; set; } public int age { get; set; } public Window1() { InitializeComponent();
hbbliyong
2018/03/05
7440
iframe怎么将参数传递给vue 父组件
在子页面的iframe中想将参数传递给Vue父组件,可以使用postMessage()方法将数据发送给父窗口。父组件可以通过监听message事件来接收并处理这些数据。
王小婷
2023/08/10
1.4K0
MEF框架基础理解
Managed Extensibility Framework (MEF) 是用于创建可扩展的轻量级应用程序的库。 它让应用程序开发人员得以发现和使用扩展且无需配置。 它还让扩展开发人员得以轻松地封装代码并避免脆弱的紧密依赖性。 MEF 让扩展不仅可在应用程序内重复使用,还可以跨程序重复使用。
JusterZhu
2023/09/06
7650
MEF框架基础理解
将多个属性传递给 Vue 组件的几种方式
所有使用基于组件的体系结构(如Vue和React)的开发人员都知道,创建可重用组件是很困难的,而且大多数情况下,最终会通过传入大量的属性,以便从外部更容易地控制和自定义组件。这并不坏,但是传递大量属性确实会变得有点麻烦和丑陋。
前端小智@大迁世界
2020/05/11
1.9K0
Autofac容器对象实例的几种生命周期类型
实例范围决定了如何在同一服务的请求之间共享实例。 请注意,您应该熟悉生命周期范围的概念,以便更好地理解此处发生的情况。 当请求服务时,Autofac可以返回单个实例(单实例作用域),新实例(每个依赖作用域)或某种上下文中的单个实例,例如 线程或HTTP请求(每个生命周期范围)。 这适用于从显式Resolve()调用返回的实例以及容器内部创建的实例,以满足另一个组件的依赖关系。 选择正确的生命周期范围将有助于避免组件寿命过长或不够长的俘获依赖和其他陷阱。 开发人员需要为每个应用程序组件做出正确的选择。
晓晨
2018/06/22
1.6K0
WPF随笔(十)–使用AvalonDock实现可停靠式布局「建议收藏」
我们每天使用的许多软件都使用了可停靠式布局,可以方便的打开、关闭、收起、展开、移动选项卡。今天就来说明如何使用AvalonDock实现这种可停靠式布局。
全栈程序员站长
2022/09/13
4.2K0
WPF随笔(十)–使用AvalonDock实现可停靠式布局「建议收藏」
Autofac 集成测试 在 ConfigureContainer 之后进行 Mock 注入
在使用 Autofac 框架进行开发后,编写集成测试时,需要用 Mock 的用于测试的模拟的类型去代替容器里面已注入的实际类型,也就需要在 Autofac 完全收集完成之后,再次注入模拟的对象进行覆盖原有业务代码注册的正式对象。但 Autofac 默认没有提供此机制,我阅读了 Autofac 的源代码之后,创建了一些辅助代码,实现了此功能。本文将告诉大家如何在集成测试里面,在使用了 Autofac 的项目里面,在所有收集完成之后,注入用于测试的 Mock 类型,和 Autofac 接入的原理
林德熙
2021/06/09
2.6K0

相似问题

如何以编程方式启用LAN唤醒

33

如何以编程方式检测错误,如IllegalArgumentException: No configs match configSpec?

11

如何以编程方式更改LAN设置(代理配置)

40

如何以编程方式检测ViewState是否被篡改

10

如何以编程方式检测png文件是否损坏?

50
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文