Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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:通过其构造函数依赖关系解决接口实现_C#_Inversion Of Control_Unity Container - Fatal编程技术网

C# Unity:通过其构造函数依赖关系解决接口实现

C# Unity:通过其构造函数依赖关系解决接口实现,c#,inversion-of-control,unity-container,C#,Inversion Of Control,Unity Container,我试图了解国际奥委会,并确定它是否适合这种特殊情况。我有以下代码: public class List { ... } public class Form { ... } public interface IService { ... } public class ListService : IService { public ListService(List list) { } } public class FormService : IService { public

我试图了解国际奥委会,并确定它是否适合这种特殊情况。我有以下代码:

public class List { ... }
public class Form { ... }

public interface IService { ... }

public class ListService : IService {
    public ListService(List list) { }
}

public class FormService : IService {
    public FormService(Form form) { }
}

class Program {
    static void Main(string[] args) {
        IUnityContainer container = new UnityContainer();
        container.RegisterType<IService, ListService>(new InjectionConstructor(typeof(List)));
        container.RegisterType<IService, FormService>(new InjectionConstructor(typeof(Form)));

        IService formService = container.Resolve<IService>(new DependencyOverride<Form>(new Form()));
        IService listService = container.Resolve<IService>(new DependencyOverride<List>(new List()));
    }
}
上述代码在某种意义上是一种混合工厂\IoC方法。谢天谢地,团结的灵活性。纯IoC在我的许多场景中都不适用。

使用Unity,与接口关联多个注册的唯一方法(开箱即用)是使用命名注册

在您所展示的场景中(实际场景可能更复杂),这似乎不是一个问题。我想你会在某种程度上知道你想要什么类型的服务(表格和列表)

如果场景更复杂,那么你几乎总能通过工厂实现你想要的(问题中提到了工厂,所以它看起来很合适)。有关一些工厂示例,请参见

基本上,所有适用的
IService
实例都可以注入工厂,工厂可以在运行时(并基于任何适用的标准)确定要返回的合适的
IService
实例。您甚至可以插入
Func
而不是
iSeries
来延迟对象创建。

使用Unity,使多个注册与接口关联的唯一方法(现成)是使用命名注册

在您所展示的场景中(实际场景可能更复杂),这似乎不是一个问题。我想你会在某种程度上知道你想要什么类型的服务(表格和列表)

如果场景更复杂,那么你几乎总能通过工厂实现你想要的(问题中提到了工厂,所以它看起来很合适)。有关一些工厂示例,请参见


基本上,所有适用的
IService
实例都可以注入工厂,工厂可以在运行时(并基于任何适用的标准)确定要返回的合适的
IService
实例。您甚至可以插入
Func
而不是
IService
来延迟对象创建。

我认为这是不可能的。为什么不简单地给每个注册都起一个名字呢?请注意,您可以在没有容器的情况下进行IOC。这就是所谓的,我认为这是不可能的。为什么不简单地给每个注册都起一个名字呢?请注意,您可以在没有容器的情况下进行IOC。这就是所谓的。
public class Form { }
public class FormService : IService{
    [InjectionConstructor]
    public FormService(Func<string, Form> func, string name):this(func(name)) { }
    public FormService(Form form) { }
}
public class FormDataViewModel {
    public FormDataViewModel(FormService svc) { }
}
public interface IService { }
class Program {
    static Form GetForm(string name) {
        //wcf call
        return new Form();
    }
    static void Main(string[] args) {
        IUnityContainer container = new UnityContainer();
        container.RegisterInstance<Func<string, Form>>(GetForm);
        container.RegisterType<IService, FormService>("form");
        FormDataViewModel vm = container.Resolve<FormDataViewModel>(new DependencyOverride<string>("/system/form/test"));
    }
}