C# Unity InjectionProperty不起作用
我对依赖于其“视图”(GUI)的计算器的配置定义如下(然后在当前上下文中解析): 如果您想查看C# Unity InjectionProperty不起作用,c#,.net,dependency-injection,properties,unity-container,C#,.net,Dependency Injection,Properties,Unity Container,我对依赖于其“视图”(GUI)的计算器的配置定义如下(然后在当前上下文中解析): 如果您想查看依赖项的定义,请注意它绝对等同于unity容器的投影,除非我扩展了对生命周期管理器的直接控制 问题很简单;根据上述设置,属性IView在运行时解析为null。这简直就好像团结是行不通的 @Haukinger这是包装纸: using System.Collections.Generic; using Unity; using Unity.Lifetime; using Unity.Registration
依赖项的定义,请注意它绝对等同于unity容器的投影,除非我扩展了对生命周期管理器的直接控制
问题很简单;根据上述设置,属性IView
在运行时解析为null。这简直就好像团结是行不通的
@Haukinger这是包装纸:
using System.Collections.Generic;
using Unity;
using Unity.Lifetime;
using Unity.Registration;
namespace Calculator.Utils
{
public static class Dependencies
{
private static IUnityContainer graph;
private static List<KeyValuePair<string, LifetimeManager>> lifetimeManagers;
static Dependencies(){
//container
graph = new UnityContainer();
//instance managers 1 per dependency instance (implementor)
lifetimeManagers = new List<KeyValuePair<string, LifetimeManager>>();
}
//STATES:
public static void register<I, P>(string alias, params InjectionMember[] injections)
{
ContainerControlledTransientManager newLM = new ContainerControlledTransientManager();
lifetimeManagers.Add(new KeyValuePair<string, LifetimeManager>(
alias,
newLM
));
graph.RegisterType(
typeof(I),
typeof(P),
alias,
newLM,
injections
);
}
//function is identitical to Resolve
public static T resolve<T>(string alias)
{
return (T)graph.Resolve(typeof(T), alias);
}
public static void dispose(string alias)
{
LifetimeManager target = (ContainerControlledTransientManager)lifetimeManagers.Find((elem)=>(elem.Key.Equals(alias))).Value;
target.Dispose();
}
}
使用System.Collections.Generic;
统一使用;
使用统一。终身;
使用统一注册;
命名空间计算器.Utils
{
公共静态类依赖项
{
私有静态IUnityContainer图;
私有静态列表生命周期管理器;
静态依赖项(){
//容器
图形=新的UnityContainer();
//实例管理器每个依赖实例1个(实现者)
LifetimeManager=新列表();
}
//国家:
公共静态无效寄存器(字符串别名,参数InjectionMember[]injections)
{
ContainerControlled TransientManager newLM=新的ContainerControlled TransientManager();
LifetimeManager.Add(新的KeyValuePair)(
别名
纽姆
));
graph.RegisterType(
第(I)类,
类型(P),
别名
纽姆,
注射
);
}
//函数是相同的,无法解析
公共静态T解析(字符串别名)
{
return(T)graph.Resolve(typeof(T),别名);
}
公共静态void dispose(字符串别名)
{
LifetimeManager目标=(ContainerControlled TransientManager)LifetimeManager.Find((elem)=>(elem.Key.Equals(别名)).Value;
target.Dispose();
}
}
}仅当您请求所有已注册类型时才会注入命名注册,即IView[]allview
。如果您只请求一个实例,您将收到默认注册,在您的情况下,只需null
,因为您没有默认注册
删除名称(standardView
)并将null
作为参数name
传递给RegisterType
,就可以开始了
编辑:此代码在我的机器上运行良好
internal class Program
{
static void Main( string[] args )
{
var container = new UnityContainer();
container.RegisterType<IDependency, MyDependency>((string)null);
var resolved = container.Resolve<Consumer>();
// resolved.Dependency is an instance of MyDependency
}
}
internal class Consumer
{
[Dependency]
public IDependency Dependency { get; set; }
}
public interface IDependency
{
}
internal class MyDependency : IDependency
{
}
内部类程序
{
静态void Main(字符串[]参数)
{
var container=new UnityContainer();
container.RegisterType((string)null);
var resolved=container.Resolve();
//已解决。Dependency是MyDependency的一个实例
}
}
内部类消费者
{
[依赖性]
公共IDependency依赖项{get;set;}
}
公共接口独立性
{
}
内部类MyDependency:IDependency
{
}
我已在寄存器和解析阶段将alias参数更改为null。但它仍然解析为null。有什么想法吗?我用unity 5.6构建了一个最小的示例,效果很好。我怀疑你的包装有问题。我能看看吗?还有,我有Unity 5.5.6,但考虑到我所做的是如此基本,我怀疑这是个问题。你能把你的包装也添加到问题中吗?
using System.Collections.Generic;
using Unity;
using Unity.Lifetime;
using Unity.Registration;
namespace Calculator.Utils
{
public static class Dependencies
{
private static IUnityContainer graph;
private static List<KeyValuePair<string, LifetimeManager>> lifetimeManagers;
static Dependencies(){
//container
graph = new UnityContainer();
//instance managers 1 per dependency instance (implementor)
lifetimeManagers = new List<KeyValuePair<string, LifetimeManager>>();
}
//STATES:
public static void register<I, P>(string alias, params InjectionMember[] injections)
{
ContainerControlledTransientManager newLM = new ContainerControlledTransientManager();
lifetimeManagers.Add(new KeyValuePair<string, LifetimeManager>(
alias,
newLM
));
graph.RegisterType(
typeof(I),
typeof(P),
alias,
newLM,
injections
);
}
//function is identitical to Resolve
public static T resolve<T>(string alias)
{
return (T)graph.Resolve(typeof(T), alias);
}
public static void dispose(string alias)
{
LifetimeManager target = (ContainerControlledTransientManager)lifetimeManagers.Find((elem)=>(elem.Key.Equals(alias))).Value;
target.Dispose();
}
}
internal class Program
{
static void Main( string[] args )
{
var container = new UnityContainer();
container.RegisterType<IDependency, MyDependency>((string)null);
var resolved = container.Resolve<Consumer>();
// resolved.Dependency is an instance of MyDependency
}
}
internal class Consumer
{
[Dependency]
public IDependency Dependency { get; set; }
}
public interface IDependency
{
}
internal class MyDependency : IDependency
{
}