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 Container
chamar este método, uma instância pode ser registrada no contêiner.
Parâmetro 1: type
especifique o tipo da instância.
Parâmetro 2: name
especifique o nome da instância.
Parâmetro 3: instance
especifique a instância a ser registrada.
Parâmetro 4: lifetime
especifique o ciclo de vida da instância (o Unity tem 6 modelos de gerenciamento de vida útil integrados. O padrão é TransientLifetimeManager
obter uma nova instância a cada vez )
public static T Resolve<T>(string name);
Ao Container
chamar esse método, pode ser obtida uma instância do nome especificado.
Genérico: T
especifique o tipo da instância a ser obtida
Parâmetro 1: name
especifique o nome da instância a ser obtida
Container
Uma 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: LifetimeManager
Esta 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.
TransientLifetimeManager
Gere uma nova instância de objeto de tipo para cada solicitação. (Padrão)
Quando este parâmetro é usado, cada instância obtida é nova.
ContainerControlledLifetimeManager
Cada 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:
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);
}
IFood
Uma instância do tipo não pode ser obtida neste momento . Porque bananas são do Banana
tipo. Mas se você declarar bananas como um IFood
tipo, também pode usar a IFood
aquisiçã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 ~