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();
}
}
}
我的问题是:
- 我如何使用autofacc来解决SessionFactory依赖于issystemsetting ?每次我想使用SessionFactory时,我需要使用
builder.Resolve<ISystemSetting>
作为参数吗? - 依赖注入模式,或者只是Autofac,带来了很多新词,比如Service, Resolve, Singleton等。我在哪里可以从零开始学习这些东西?其他DI框架都是一样的吗?
- 我需要了解IoC容器如何在多层项目中工作,是否每层都需要引用Autofac?
谢谢。
-
你已经在你的bootstrap中做过了。
builder.RegisterType<SystemSetting>().As<ISystemSetting>();
这意味着每个依赖于issystemsettings的对象都会得到SystemSettings的一个实例。所以如果你使用
在代码的某个地方(你真的应该在你的组合根目录中这样做),容器将为你做这项工作。如果你有很多对象,有多个依赖关系,你就会开始理解为什么IoC容器是"神奇的";)var mySessionFactory = myContainer.Resolve<SessionFactory>();
-
好. .许多IoC容器使用resolve这个词。它的意思是"给我一个对象和它的依赖项"服务和单例是面向对象设计语言中的两个词。它们不是特定于IoC容器的。你可以谷歌一下。我认为这样的事情没有总结。通过阅读书籍、文章和教程,你将及时获得它。
-
。事实上,这是不可能的。有一种模式叫做servicelocator,有些人认为它是一种反模式。如果遵循这种模式,那么所有对象都只有一个依赖项,即容器!他们自己从中得到他们需要的东西。
public class MyClass { private DependencyOne dep1; public MyClass(WhatEverContainer container) { dep1 = container.Resolve<DependencyOne>(); } }
…在这种情况下,容器将充当服务定位器,每个需要依赖项的对象都将请求服务定位器获取该依赖项。这将破坏控制反转的全部价值,并使您的对象依赖于容器。注入对象实际需要的东西,而不是他们需要的东西,以便找到他们实际需要的东西;D
让你的对象与容器无关。在你的组合根中使用你的容器,这是你把对象和应用程序的层粘合在一起的地方。这里有一些阅读:http://blog.ploeh.dk/2011/07/28/CompositionRoot/