Asp.NetCore AutoFacプログラムセットによる依存注入

3050 ワード

一、注入に依存するための専用インタフェース(IAutoInject)を作成し、すべてのサービスインタフェースがこのインタフェースに継承される

namespace DDD.Domain
{
    public interface IAutoInject
    {
    }
}

二、サービスインタフェースを追加し、IAutoInjectを継承する必要がある

namespace DDD.Domain.Product.Inter
{
    public interface IProductTypeService : IAutoInject
    {
        int Add(ProductType entity);
    }
}

三、サービス実装クラスを追加し、サービスインタフェースIProductTypeサービスを継承する


namespace DDD.Domain.Product.Impl
{
    public class ProductTypeService: DBBase , IProductTypeService
    {
        public int Add(ProductType entity)
        {
           return db.Insertable(entity).ExecuteCommand();
        }
    }
}

四、依存注入クラスの追加


namespace CoreTest
{
    public class AutoFacIoc
    {
        public static IContainer Injection(IServiceCollection services)
        {
            var builder = new ContainerBuilder();
            //InstancePerLifetimeScope:   Lifetime           
            //SingleInstance:    ,    ,             ;         ;
            //InstancePerDependency:    ,    ,         ;             ;

            //  IAutoInject   
            var baseTypeDomain = typeof(DDD.Domain.IAutoInject);
            //              
            //DDD.Domain              
            Assembly assembliesDomain = Assembly.Load("DDD.Domain");
            //      
            builder.RegisterAssemblyTypes(assembliesDomain)
                .Where(b => b.GetInterfaces().Any(c => c == baseTypeDomain && b != baseTypeDomain))
                .AsImplementedInterfaces()
                .SingleInstance(); //     

            builder.Populate(services);
            return builder.Build();
        }
    }
}

五、またスタートします。csで呼び出す


説明:ConfigureServicesメソッドの戻り値をIServiceProviderに変更する必要があります.ApplicationContainerプロパティの追加
 public IContainer ApplicationContainer { get; private set; }
 public IServiceProvider ConfigureServices(IServiceCollection services)
 {
     services.AddMvc();

     this.ApplicationContainer = AutoFacIoc.Injection(services);
     return new AutofacServiceProvider(this.ApplicationContainer);
  }

六、構造関数による注入

namespace CoreTest.Controllers
{
    public class ProductTypeController : Controller
    {
        IProductTypeService productTypeService;
        public ProductTypeController(IProductTypeService _productTypeService)
        {
            this.productTypeService = _productTypeService;
        }
        public IActionResult Add()
        {
            ProductType entity = new ProductType()
            {
                CreateBy = "",
                CreateTime = DateTime.Now
            };
            int re = productTypeService.Add(entity);

            re += productApp.AddProductType(entity);
            return Json(re);
        }
    }
}

最後に、依存注入構造は、依存注入インタフェースIAutoInject="サービスインタフェースIProductType-Service="サービス実装クラスProductType-Service