dependency-injection - C# 中的 autofac "Hello World"应用程序 - 初始化

标签 dependency-injection inversion-of-control autofac

我正在寻找有关 DI 的简单“Hello World”示例的帮助。我不明白的是如何在 DI 框架(autofac)中初始化类“Foo”和“Bar”。

namespace AutofacTesting
{
    //these classes are intended to be used with autofac / DI
    public interface IFooBar
    {
        void Draw();
    }

    public class Bar : IFooBar
    {           
        public void Draw()
        {
            MessageBox.Show("Drawing something in Bar");
        }
    }

    public class Foo : IFooBar
    {
        public void Draw()
        {
            MessageBox.Show("Drawing somthing in Foo");
        }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var builder = new ContainerBuilder();

            builder.RegisterType<Bar>().As<IFooBar>();
            builder.RegisterType<Foo>().As<IFooBar>();

            var container = builder.Build();

            var taskController = container.Resolve<IFooBar>();

            taskController.Draw();

            int a = 1;
        }
    }
}

最佳答案

我认为您的意思是您想要将 BarFoo 类解析为具体实现,而不是实例化它。如果是这样你可以写:

var builder = new ContainerBuilder();

builder.RegisterType<Bar>().Named<IFooBar>("Bar");
builder.RegisterType<Foo>().Named<IFooBar>("Foo");

var container = builder.Build();

var taskController = container.ResolveNamed<IFooBar>("Bar");

taskController.Draw();

我也意识到这是一个 hello world 应用程序,但要小心不要失败到 anti-pattern of using a service locator (即到处使用 contains.Resolve )。相反,请考虑允许您在同一个位置进行所有注册和解析的设计,名为 composition root .

我提到这一点是因为这种程度的模糊性(即为给定接口(interface)注册多个concreate类型)可能会导致人们开始使用服务定位器模式。相反,在更复杂的应用程序中,请考虑重构您的 API,以减少解析注册类型时的歧义。

关于dependency-injection - C# 中的 autofac "Hello World"应用程序 - 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10335789/

相关文章:

flutter - 带参数的类的 Dart 依赖注入(inject)

c# - 使用带有 XML 配置的 Autofac

.net - 任何现有的 IoC 容器都可以动态创建惰性代理类吗?

c# - Asp.net core 2.1 web api中的自定义授权

c# - AutoFac:PropertyWiringFlags.AllowCircularDependencies 有什么作用?

asp.net-mvc - ASP.NET MVC Web API 和 StructureMap : "does not have a default constructor"

c# - 为什么使用 AddScoped() 而不是 AddSingleton()?

c# - 在 MVC3 应用程序中解耦 Entity Framework

unit-testing - 从测试覆盖中排除代码

c# - Ninject 工厂扩展和 InCallScope 没有给出预期的结果