autofacc依赖注入实现

本文关键字:实现 注入 依赖 autofacc | 更新日期: 2023-09-27 18:11:04

我开始了一个新的项目,我来自于一个直接和'幼稚'的编程。

现在我正在考虑使用IoC容器,特别是使用Autofac的依赖注入模式。

假设我有一个简单的会话工厂:
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中,我这样配置autoface:

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. 我如何使用autofacc来解决SessionFactory依赖于issystemsetting ?每次我想使用SessionFactory时,我需要使用builder.Resolve<ISystemSetting>作为参数吗?
  2. 依赖注入模式,或者只是Autofac,带来了很多新词,比如Service, Resolve, Singleton等。我在哪里可以从零开始学习这些东西?其他DI框架都是一样的吗?
  3. 我需要了解IoC容器如何在多层项目中工作,是否每层都需要引用Autofac?

谢谢。

autofacc依赖注入实现

  1. 你已经在你的bootstrap中做过了。

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

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

    var mySessionFactory = myContainer.Resolve<SessionFactory>();
    
    在代码的某个地方(你真的应该在你的组合根目录中这样做),容器将为你做这项工作。如果你有很多对象,有多个依赖关系,你就会开始理解为什么IoC容器是"神奇的";)
  2. 好. .许多IoC容器使用resolve这个词。它的意思是"给我一个对象和它的依赖项"服务和单例是面向对象设计语言中的两个词。它们不是特定于IoC容器的。你可以谷歌一下。我认为这样的事情没有总结。通过阅读书籍、文章和教程,你将及时获得它。

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

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

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

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