如何使用 unity(基础)注入依赖?
How to inject dependency using unity (basics) ?
我是初学者 injection.I 在控制台应用程序中使用 Microsoft Unity 来开始和复习基础知识。我想根据注册到接口引用的 class 调用加法 Class 或减法 Class 的方法。但是我将 InterfaceReference 引用为 null。请建议我在以下情况下做错了什么?
我使用了一个接口 -
namespace ConsoleApplication3
{
interface IArithmetic
{
int DoOperation(int a, int b);
}
}
还有 2 个班级 -
namespace ConsoleApplication3
{
class Addition : IArithmetic
{
public int DoOperation(int a, int b)
{
return a + b;
}
}
}
namespace ConsoleApplication3
{
class Substraction : IArithmetic
{
public int DoOperation(int a, int b)
{
return a - b;
}
}
}
namespace ConsoleApplication3
{
class Program
{
private static IArithmetic InterfaceReference;
public Program(IArithmetic InterfaceReferenceParam)
{
InterfaceReference = InterfaceReferenceParam;
}
static void Main(string[] args)
{
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IArithmetic, Addition>();
int output = InterfaceReference.DoOperation(5, 2);
Console.Write(output);
Console.WriteLine();
}
}
}
您没有实例化您的程序 class,因此注入 IArithmetic 实现的构造函数永远不会 运行。您需要使用 Unity Resolve 创建程序的实例 class。看看
类似于下面的代码(我有一段时间没有使用unity,所以我不确定语法是否完全正确)。基本上你还需要在Unity中注册Program class,然后使用Unity Resolve方法创建Program的实例。因为 Unity 知道 Program,所以这个 resolve 将为 Program 创建依赖树。
namespace ConsoleApplication3
{
class Program
{
private IArithmetic InterfaceReference;
public Program(IArithmetic InterfaceReferenceParam)
{
InterfaceReference = InterfaceReferenceParam;
}
public void Run()
{
int output = InterfaceReference.DoOperation(5, 2);
Console.Write(output);
Console.WriteLine();
}
static void Main(string[] args)
{
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IArithmetic, Addition>();
myContainer.RegisterType<Program, Program>();
var program = myContainer.Resolve<Program>();
program.Run();
}
}
}
问题是您在注册类型后没有调用 Unity Resolve 方法。例如,这将起作用:
class Program
{
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.RegisterType(typeof(IArithmetic), typeof(Addition));
var arithmeticHelper = container.Resolve<IArithmetic>();
int output = arithmeticHelper.DoOperation(5, 2);
Console.Write(output);
Console.ReadKey();
}
}
我是初学者 injection.I 在控制台应用程序中使用 Microsoft Unity 来开始和复习基础知识。我想根据注册到接口引用的 class 调用加法 Class 或减法 Class 的方法。但是我将 InterfaceReference 引用为 null。请建议我在以下情况下做错了什么?
我使用了一个接口 -
namespace ConsoleApplication3
{
interface IArithmetic
{
int DoOperation(int a, int b);
}
}
还有 2 个班级 -
namespace ConsoleApplication3
{
class Addition : IArithmetic
{
public int DoOperation(int a, int b)
{
return a + b;
}
}
}
namespace ConsoleApplication3
{
class Substraction : IArithmetic
{
public int DoOperation(int a, int b)
{
return a - b;
}
}
}
namespace ConsoleApplication3
{
class Program
{
private static IArithmetic InterfaceReference;
public Program(IArithmetic InterfaceReferenceParam)
{
InterfaceReference = InterfaceReferenceParam;
}
static void Main(string[] args)
{
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IArithmetic, Addition>();
int output = InterfaceReference.DoOperation(5, 2);
Console.Write(output);
Console.WriteLine();
}
}
}
您没有实例化您的程序 class,因此注入 IArithmetic 实现的构造函数永远不会 运行。您需要使用 Unity Resolve 创建程序的实例 class。看看
类似于下面的代码(我有一段时间没有使用unity,所以我不确定语法是否完全正确)。基本上你还需要在Unity中注册Program class,然后使用Unity Resolve方法创建Program的实例。因为 Unity 知道 Program,所以这个 resolve 将为 Program 创建依赖树。
namespace ConsoleApplication3
{
class Program
{
private IArithmetic InterfaceReference;
public Program(IArithmetic InterfaceReferenceParam)
{
InterfaceReference = InterfaceReferenceParam;
}
public void Run()
{
int output = InterfaceReference.DoOperation(5, 2);
Console.Write(output);
Console.WriteLine();
}
static void Main(string[] args)
{
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IArithmetic, Addition>();
myContainer.RegisterType<Program, Program>();
var program = myContainer.Resolve<Program>();
program.Run();
}
}
}
问题是您在注册类型后没有调用 Unity Resolve 方法。例如,这将起作用:
class Program
{
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.RegisterType(typeof(IArithmetic), typeof(Addition));
var arithmeticHelper = container.Resolve<IArithmetic>();
int output = arithmeticHelper.DoOperation(5, 2);
Console.Write(output);
Console.ReadKey();
}
}