• ASP.Net Core -- AutoFac


    ASP.NET Core本身已经集成了一个轻量级的IOC容器,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可,但是我们还可以使用其它的扩展进行服务注册

    本案例将使用AutoFac进行服务注册,然后读取数据列表

    1:框架大概结构:

    Tutorials.Data:数据库上下文DbContext

    Tutorials.IRepository:数据仓储接口

    Tutorials.Repository:数据仓储接口实现类

    Tutorials.IServices:业务服务接口(在控制器中调用该接口)

    Tutorials.Services:业务服务接口实现类

    2:具体实现如下:

    在Model里新建一个实体类,Student.cs:

    public class Student
        {
            public int  Id { get; set; }
            public string Name { get; set; }
            public string Email { get; set; }
            public string LoginAccount { get; set; }
            public string LoginPwd { get; set; }
            public int Age { get; set; }
            public string Gender { get; set; }
            public string Address { get; set; }
            public string Hobby { get; set; }
            public long Phone { get; set; }
            public string IdNumber { get; set; }
        }
    

    然后在IRepository新建一个仓储接口,IStudentRepository.cs:

    public interface IStudentRepository
        {
            public List<Student> InitStudentList();
        }
    

    在Repository里新建StudentRepository.cs实现仓储接口:

    public class StudentRepository : IStudentRepository
        {
            private readonly DataContext _dbContext;
    
            public StudentRepository(DataContext dbContext)
            {
                _dbContext = dbContext;
            }
            public List<Student> InitStudentList()
            {
                return _dbContext.Student.ToList();
                
            }
        }
    

    在IServcies里新建一个IStudentServcie.cs服务接口:

    public interface IStudentServcie
        {
            public List<Student> InitStudentList();
        }
    

    然后在Services里新建一个StudentServcie.cs实现服务接口,从仓储服务调用获取方法

    public class StudentServcie : IStudentServcie
        {
            private readonly IStudentRepository _studentRepository;
    
            public StudentServcie(IStudentRepository studentRepository)
            {
                _studentRepository = studentRepository;
            }
            public List<Student> InitStudentList()
            {
                return _studentRepository.InitStudentList();
            }
        }
    

    然后引入autofac扩展包:

    Autofac.Extensions.DependencyInjection
    Autofac.Extras.DynamicProxy
    

    在program里添加autofac:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    });
    

    在startup里注册服务,首先新建一个类AutofacModuleRegister.cs:

    public class AutofacModuleRegister : Autofac.Module
        {
            protected override void Load(ContainerBuilder builder)
            {
                var basePath = AppContext.BaseDirectory;
    
                var serviceDllFile = Path.Combine(basePath, "Tutorials.Services.dll");
                var repositoryDllFile = Path.Combine(basePath, "Tutorials.Repository.dll");
    
                if (!(File.Exists(serviceDllFile) && File.Exists(repositoryDllFile)))
                {
                    var msg = "Repository.dll和service.dll 丢失,因为项目解耦了,所以需要先F6编译,再F5运行,请检查 bin 文件夹,并拷贝。";
                    throw new Exception(msg);
                }
    
                var assemblysServices = Assembly.LoadFrom(serviceDllFile);
                builder.RegisterAssemblyTypes(assemblysServices).AsImplementedInterfaces().InstancePerDependency();
    
                var assemblysRepository = Assembly.LoadFrom(repositoryDllFile);
                builder.RegisterAssemblyTypes(assemblysRepository).AsImplementedInterfaces().InstancePerDependency();
            }
        }
    

    然后在Startup里添加服务:

    public void ConfigureContainer(ContainerBuilder containerBuilder) 
            {
                containerBuilder.RegisterModule(new AutofacModuleRegister());
            }
    

    这样基本就完成了,在控制器中实现注入,如下:

    public class StudentController:Controller
        {
            private readonly IStudentServcie _studentServcie;
    
            public StudentController(IStudentServcie studentServcie)
            {
                _studentServcie = studentServcie;
            }
            public IActionResult Index() 
            {
                return View(_studentServcie.InitStudentList());
            }
        }
    

      

  • 相关阅读:
    给你一个亿-电视节目总结
    给你一个亿-电视节目总结
    我的写作、爱好和好友
    我的写作、爱好和好友
    互联网和移动互联网怎么挣钱?
    互联网和移动互联网怎么挣钱?
    IT人都很忙(茫)
    Java实现 LeetCode 345 反转字符串中的元音字母
    Java实现 蓝桥杯 算法训练 谁干的好事?
    Java实现 蓝桥杯 算法训练 谁干的好事?
  • 原文地址:https://www.cnblogs.com/dcy521/p/13592473.html
Copyright © 2020-2023  润新知