gpt4 book ai didi

c# - Autofac依赖注入(inject)实现

转载 作者:太空狗 更新时间:2023-10-29 21:18:06 26 4
gpt4 key购买 nike

我开始从事一个新项目,我来自直接和“幼稚”的编程。

现在我担心使用 IoC 容器,特别是使用 Autofac 的依赖注入(inject)模式。

假设我有一个简单的 session 工厂:

namespace Warehouse.Data
{
public class SessionFactory
{
private static ISessionFactory _sessionFactory;
private static ISystemSetting _systemSetting;

SessionFactory(ISystemSetting systemSetting)
{
_systemSetting = systemSetting;

InitializeSessionFactory();
}

private static void InitializeSessionFactory()
{
_sessionFactory = Fluently.Configure()
.Database(DatabaseConfiguration)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<MyMap>())
.BuildSessionFactory();
}

public static ISession OpenSession()
{
return _sessionFactory.OpenSession();
}
}
}

在 Bootstrap.cs 中,我这样配置 autofac :

namespace Warehouse.Infrastructure
{
using Autofac;

public class Bootstrap
{
public IContainer Configure()
{
var builder = new ContainerBuilder();

builder.RegisterType<SystemSetting>().As<ISystemSetting>();
builder.RegisterType<UserRepository>().As<IUserRepository>();

return builder.Build();
}
}
}

我的问题是:

  1. 如何使用 Autofac 解决 SessionFactory 对 ISystemSetting 的依赖?我需要使用 builder.Resolve<ISystemSetting> 吗?每次我想使用 SessionFactory 作为参数?
  2. 依赖注入(inject)模式,或者可能只是 Autofac,带有许多新词,例如 Service、Resolve、Singleton 等。我在哪里可以从头开始学习这些东西?其他所有 DI 框架都一样吗?
  3. 我需要了解 IoC 容器在多层项目中的工作原理,每一层都需要引用 Autofac 吗?

谢谢。

最佳答案

  1. 您已经在 Bootstrap 中完成了。

    builder.RegisterType<SystemSetting>().As<ISystemSetting>();

    这意味着每个依赖于 ISystemSettings 的对象都会获得一个 SystemSettings 实例。所以如果你使用

    var mySessionFactory = myContainer.Resolve<SessionFactory>();

    在你的代码中的某个地方(你真的应该在你的组合根中这样做)容器会为你完成这项工作。如果您有很多对象,具有多个依赖项,您将开始理解为什么 IoC 容器是“神奇的”;)

  2. 嗯 .. 很多 IoC 容器都使用解析这个词。它只是意味着“给我一个对象及其依赖项”。服务和单例是面向对象设计语言中的词。它们并不特定于 IoC 容器。你可以用谷歌搜索它们。我认为没有像这样的东西的总结。您将通过阅读书籍、文章和学习教程及时获得它。

  3. 没有。实际上那是不行的。有一种称为 servicelocator 的模式,有些人认为它是一种反模式。如果您遵循这种模式,那么您的所有对象都只有一个依赖项,即容器!他们自己从中得到他们需要的东西。

    public class MyClass
    {
    private DependencyOne dep1;

    public MyClass(WhatEverContainer container)
    {
    dep1 = container.Resolve<DependencyOne>();
    }
    }

    ... 在那种情况下,您的容器将充当服务定位器,并且每个需要依赖项的对象都会要求服务定位器获取该依赖项。这会破坏控制反转的全部值(value),并使您的对象依赖于容器。注入(inject)对象实际需要的东西,而不是他们需要的东西,以便找到他们真正需要的东西;D

    让您的对象与容器无关。并在你的组合根中使用你的容器,那是你将应用程序的对象和层粘合在一起的地方。这里有一些东西要读:http://blog.ploeh.dk/2011/07/28/CompositionRoot/

关于c# - Autofac依赖注入(inject)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16450172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com