O uso da estrutura C # Unity (1)

Unidade

O framework Unity é um framework IOC comumente usado em C #. O Learning Unity sugere que você deve ter um certo conhecimento sobre IOC. Como outras estruturas IOC, o papel do Unity é usar injeção de dependência e inversão de controle para atingir um alto grau de desacoplamento.

Uso da Unidade

Começar com o Unity é relativamente simples. Ao contrário do Spring do Java, que requer muita configuração. Então, vamos aprender como usá-lo imediatamente.

1. Construção do projeto

1. Interface

public interface IFood
{
    
    
    string Name {
    
     set; get; }
}

2. Classe de implementação

public class Banana:IFood
{
    
    
    public string Name {
    
     get; set; } = string.Empty;
}
 public class Apple:IFood
{
    
    
    public string Name {
    
     get; set; } = string.Empty;
}
public class Beef:IFood
{
    
    
    public string Name {
    
     get; set; } = string.Empty;
}

1. Construção do contêiner IOC

Por se tratar de um programa que gerencia o uso de objetos, em primeiro lugar deve haver um container para gerenciar a criação e preservação de objetos. Desta forma, você pode selecionar os objetos que você precisa no momento de necessidade.

public static IUnityContainer Container = new UnityContainer();

2. Registro e aquisição de instâncias

1. Como se registrar e obter a versão completa

IUnityContainer RegisterInstance(Type type,string name, object instance,LifetimeManager lifetime);

Ao Containerchamar este método, uma instância pode ser registrada no contêiner.
Parâmetro 1: typeespecifique o tipo da instância.
Parâmetro 2: nameespecifique o nome da instância.
Parâmetro 3: instanceespecifique a instância a ser registrada.
Parâmetro 4: lifetimeespecifique o ciclo de vida da instância (o Unity tem 6 modelos de gerenciamento de vida útil integrados. O padrão é TransientLifetimeManagerobter uma nova instância a cada vez )

public static T Resolve<T>(string name);

Ao Containerchamar esse método, pode ser obtida uma instância do nome especificado.
Genérico: Tespecifique o tipo da instância a ser obtida
Parâmetro 1: nameespecifique o nome da instância a ser obtida

ContainerUma instância com este nome será retornada no contêiner que corresponde ao tipo.

class Program
{
    
    
	//新建IOC容器
    public static IUnityContainer Container = new UnityContainer();

	public static void Main(string[] args)
    {
    
    
        Banana banana = new Banana
        {
    
    
            Name = "香蕉"
        };
        Apple apple = new Apple
        {
    
    
            Name = "苹果"
        };
        //注册IFood类型的实例banana到容器中,key为banana。
        //TransientLifetimeManager表示每次获取该类型都是一个新实例。
        Container.RegisterInstance(typeof(IFood), "banana", banana,
         new TransientLifetimeManager());
         //获取IFood类型,key为banana的实例
        food = Container.Resolve<IFood>("banana");
        //因为每次获取该类型都新创建一个实例,因此名字不是香蕉而是空字符串。
        Console.WriteLine("取得的食物是:" + food.Name);
        Console.ReadLine();
	}
}
2. O ciclo de vida da instância

Classe abstrata de ciclo de vida: LifetimeManagerEsta classe abstrata descreve o ciclo de vida de uma instância.
Existem 6 subclasses que representam 6 diferentes ciclos de vida de uma instância.

TransientLifetimeManagerGere uma nova instância de objeto de tipo para cada solicitação. (Padrão)
Quando este parâmetro é usado, cada instância obtida é nova.
ContainerControlledLifetimeManagerCada solicitação é uma instância registrada (modo singleton)
. O modo singleton pode ser realizado quando este parâmetro é usado. A instância obtida a cada vez é a mesma.
Para outros, leia Gerenciamento do tempo de vida do objeto no contêiner Unity . Sem expansão aqui.

3. Método simplificado

1) Omita o ciclo de vida
IUnityContainer RegisterInstance( Type type, string name, object instance);

Depois que o ciclo de vida é omitido, outras funções de parâmetro permanecem inalteradas e o ciclo de vida usará o ciclo de vida padrão.
Ou seja, cada aquisição é uma nova instância.

2) Omita o nome
IUnityContainer RegisterInstance(Type type,object instance);

Depois que o nome da instância é omitido, o método de aquisição da instância nomeada não pode ser usado.
Use apenas para public static T Resolve<T>();obter uma instância desse tipo.

Ao usar chaves para obter instâncias, você pode obter com precisão diferentes instâncias do mesmo tipo.

Quando a chave não é usada, apenas uma instância desse tipo pode ser armazenada em um tipo. O segundo registro substituirá a instância registrada anteriormente.

Se você usar a mesma chave para registrar a instância. Em seguida, ele também substituirá a instância registrada anteriormente desta chave.

public static void Main(string[] args)
{
    
    
    //注册
    Banana banana = new Banana
    {
    
    
        Name = "香蕉"
    };
    Apple apple = new Apple
    {
    
    
        Name = "苹果"
    };
    Beef beef = new Beef
    {
    
    
        Name = "牛肉"
    };
    //注册IFood类型的实例banana。
    Container.RegisterInstance(typeof(IFood),banana);
    //使用
    //获取IFood类型的实例
    var food =Container.Resolve<IFood>();
    Console.WriteLine("取得的食物1是:"+food.Name);
    //为容器注入新的IFood类型实例会覆盖之前注册的IFood实例
    Container.RegisterInstance(typeof(IFood),apple);
    //获取IFood类型的实例
    food = Container.Resolve<IFood>();
    Console.WriteLine("取得的食物2是:" + food.Name);

    //注册一个key为'banana'的实例
    Container.RegisterInstance(typeof(IFood), "banana", banana,
        new ContainerControlledLifetimeManager());
    food = Container.Resolve<IFood>("banana");
    Console.WriteLine("取得的食物1是:" + food.Name);

    //再注册一个key为'banana'的实例
    Container.RegisterInstance(typeof(IFood), "banana", beef,
        new ContainerControlledLifetimeManager());
    food = Container.Resolve<IFood>("banana");
    Console.WriteLine("取得的食物2是:" + food.Name);
    Console.ReadLine();
}

Resultado:
Insira a descrição da imagem aqui
3) Tipo de omissão
IUnityContainer RegisterInstance(object instance);

Quando o tipo não é especificado, a declaração padrão é o tipo da instância registrada.

public static void Main(string[] args)
{
    
    
     //注册
     Banana banana = new Banana
     {
    
    
         Name = "香蕉"
     };
     //注册IFood类型的实例banana。
     Container.RegisterInstance(banana);
     //使用
     //获取IFood类型的实例
     var food =Container.Resolve<Banana>();
     Console.WriteLine("取得的食物1是:"+food.Name);
}

IFoodUma instância do tipo não pode ser obtida neste momento . Porque bananas são do Bananatipo. Mas se você declarar bananas como um IFoodtipo, também pode usar a IFoodaquisição de tipo.
Isso mostra que o tipo usado ao registrar no contêiner é o tipo quando a instância é declarada, não o tipo da própria instância.

4) Use genéricos para especificar o tipo de registro e
IUnityContainer RegisterInstance<T>(object instance);apenas especifique o tipo e a instância.

IUnityContainer RegisterInstance<T>(string name, object instance);Especifique o tipo, valor-chave e instância.
IUnityContainer RegisterInstance<T>(string name, object instance,LifetimeManager lifetime);Especifique o tipo, valor-chave, instância e ciclo de vida.
Mova o tipo da instância do parâmetro para o método genérico. Os parâmetros são reduzidos e o método de uso real permanece inalterado.

Posteriormente, apresentaremos outros métodos de registro e métodos de configuração. Para ser continuado ~

Acho que você gosta

Origin blog.csdn.net/qq_42068856/article/details/106181178
Recomendado
Clasificación