Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity InjectionProperty不起作用_C#_.net_Dependency Injection_Properties_Unity Container - Fatal编程技术网

C# Unity InjectionProperty不起作用

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

我对依赖于其“视图”(GUI)的计算器的配置定义如下(然后在当前上下文中解析):

如果您想查看
依赖项的定义,请注意它绝对等同于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
{
}