簡體   English   中英

如何在Autofac中注冊這些類

[英]How to Register these class In Autofac

我使用autofac作為Ioc容器。 我有三個課程:

class Service
{
     public Service(Repository rep,UnitOfWork context){}

}

Class Repository
{
     public Repository(UnitOfWork context){}
}

class UnitOfWork{}

Service and Repository需要UnitOfWork的相同實例

怎么做? 以及如何在XmlConfiguration中創建它

編輯:我誤解了這一點,並認為這是一個關於如何使用autofac來注冊依賴項的問題。 如果要保持相同的UnitOfWork,則需要將實例的生命周期作為范圍。 如果您在ASP.NET或WCF應用程序中使用它,您可以注冊您的依賴項,如下所示:

typeBuilder.RegisterType<UnitOfWork>().InstancePerLifetimeScope();
typeBuilder.RegisterType<Repository>();
typeBuilder.RegisterType<Service>();

要使用像Autofac這樣的容器,您需要做的第一件事就是注冊所有依賴項。 在Autofac中,您可以通過幾種方式實現這一點,但所有這些方法都依賴於使用ContainerBuilder ContainerBuilder依賴於擴展方法,因此請確保您具有Autofac命名空間的using語句。

您可以顯式定義工廠方法:

// Explicitly 
var builder = new ContainerBuilder();
builder.Register<UnitOfWork>(b => new UnitOfWork());
builder.Register<Repository>(b => new Repository(b.Resolve<UnitOfWork>()));
builder.Register(b => new Service(b.Resolve<Repository>(), b.Resolve<UnitOfWork>()));

在這種情況下,使用ContainerBuilder我們訪問Register<>()方法來提供服務接口(這就是我們要求容器獲取服務的方式),我不使用接口,只使用實際類型。 每當你向容器詢問UnitOfWork它都會使用工廠方法new UnitOfWork()來生成一個。 在現實生活中,你可能會要求IUnitOfWork 這可能都有點冗長,但是當您需要用於創建依賴關系的自定義邏輯時,它非常方便。

您可以像使用任何其他依賴項容器一樣使用構建器,只需注冊類型即可。

// Implicitly
var typeBuilder = new ContainerBuilder();
typeBuilder.RegisterType<UnitOfWork>();
typeBuilder.RegisterType<Repository>();
typeBuilder.RegisterType<Service>();

這種方法依賴於注冊構建類所需的所有依賴項。 然后容器將使用反射來解析任何構造函數參數。 如果未注冊參數,則容器將拋出具有無法解析的類型的異常。 在這種情況下,服務依賴於UnitOfWorkRepository Repository還依賴於UnitOfWork 這些依賴項表示為構造函數參數。 為了從容器請求RepositoryService ,必須注冊所有依賴項

您可以使用配置方法。

如果您使用的是app.config文件,則可以像這樣定義配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
  </configSections>

  <autofac defaultAssembly="AutoFacTest">
    <components>
      <component
              type="AutoFacTest.Repository, AutoFacTest"
              service="AutoFacTest.Repository" />

      <component
               type="AutoFacTest.UnitOfWork, AutoFacTest"
               service="AutoFacTest.UnitOfWork" />

      <component
              type="AutoFacTest.Service, AutoFacTest"
              service="AutoFacTest.Service" />
    </components>
  </autofac>
</configuration>

首先,請注意我們必須定義一個配置部分(注意<ConfigSections> )。 然后,我們可以創建一個<autofac>部分來定義所有依賴項。 表示法非常簡單,您基本上為每個依賴項創建一個<component> 每個組件都有一個service屬性,用於定義將要請求的類型。 還有一個type屬性,用於定義在請求服務實例時要創建的對象。 這類似於builder.Register<UnitOfWork>(b => new UnitOfWork())其中UnitOfWork是請求的服務(在本例中)也是要創建的類型。

要使用配置創建構建器,請使用ConfigurationSettingsReader()

// Config
var configBuilder = new ContainerBuilder();
configBuilder.RegisterModule(new ConfigurationSettingsReader("autofac"));

您必須傳入配置部分的名稱(在本例中為autofac )。 一旦配置了依賴項,就必須構建一個容器。 ContainerBuilder包含一個執行此操作的方法:

var container = builder.Build();
var typeContainer = typeBuilder.Build();
var configContainer = configBuilder.Build();

一旦你有了容器,你可以請求你的服務實例:

container.Resolve<Service>().DoAwesomeness();
typeContainer.Resolve<Service>().DoAwesomeness();
configContainer.Resolve<Service>().DoAwesomeness();

完整計划:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autofac;
using Autofac.Configuration;

namespace AutoFacTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // Explicitly 
            var builder = new ContainerBuilder();
            builder.Register<UnitOfWork>(b => new UnitOfWork());
            builder.Register<Repository>(b => new Repository(b.Resolve<UnitOfWork>()));

            builder.Register(b => new Service(b.Resolve<Repository>(), b.Resolve<UnitOfWork>()));

            // Implicitly
            var typeBuilder = new ContainerBuilder();
            typeBuilder.RegisterType<UnitOfWork>();
            typeBuilder.RegisterType<Repository>();
            typeBuilder.RegisterType<Service>();

            // Config
            var configBuilder = new ContainerBuilder();
            configBuilder.RegisterModule(new ConfigurationSettingsReader("autofac"));

            var container = builder.Build();
            var typeContainer = typeBuilder.Build();
            var configContainer = configBuilder.Build();


            container.Resolve<Service>().DoAwesomeness();
            typeContainer.Resolve<Service>().DoAwesomeness();
            configContainer.Resolve<Service>().DoAwesomeness();
            Console.Read();
        }
    }

    public class Repository
    {
        private readonly UnitOfWork _unitOfWork;
        public Repository(UnitOfWork uow)
        {
            _unitOfWork = uow;
        }

        public void PrintStuff(string text)
        {
            Console.WriteLine(text);
        }
    }

    public class Service
    {
        private readonly Repository _repository;
        private readonly UnitOfWork _unitOfWork;

        public Service(Repository repo, UnitOfWork uow)
        {
            _repository = repo;
            _unitOfWork = uow;
        }
        public void DoAwesomeness()
        {
            _repository.PrintStuff("Did awesome stuff!");
            _unitOfWork.Commit();
        }
    }

    public class UnitOfWork
    {
        public bool Commit()
        {
            return true;
        }
    }


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM