C# 4.0 通过用户参数解析依赖关系

C# 4.0 通过用户参数解析依赖关系,c#-4.0,dependency-injection,C# 4.0,Dependency Injection,我经常需要使用一些类,这些类本身必须加载一些依赖项才能工作。 然而,我的组件可以有多个具体的依赖性实现,它将选择一个,而不是基于某些对象参数的另一个 真正的问题是,当应用程序启动时,对象参数总是未知的,所以我现在无法注册任何依赖项,也无法解决它们 相反,例如,当我需要使用某个本身需要加载某些依赖项的类时,我知道concreteBuilder使用的对象参数,以便返回适当的实现: interface ISample { } class ParamForBuildSomeISampleImpleme

我经常需要使用一些类,这些类本身必须加载一些依赖项才能工作。 然而,我的组件可以有多个具体的依赖性实现,它将选择一个,而不是基于某些对象参数的另一个

真正的问题是,当应用程序启动时,对象参数总是未知的,所以我现在无法注册任何依赖项,也无法解决它们

相反,例如,当我需要使用某个本身需要加载某些依赖项的类时,我知道
concreteBuilder
使用的对象参数,以便返回适当的实现:

interface ISample { }

class ParamForBuildSomeISampleImplementation
{
    // this instance cannot be create by my startUpApplication - Container - Resolver.
    // Instead, all time dependency is required (buttonClick, pageLoad and so on), this class can be instantiated.
}

class Sample1 : ISample 
{
    // some implementation
}

class Sample2 : ISample
{
    // some other implementation
}

class MyISampleFactory
{
    // Build ISample
    public ISample Build(ParamForBuilderISample obj)
    {
        // if obj.someProperty == ".." return new Sample1();
        // else if obj.someProperty == "--" return new Sample2();
        // else if ...
    }
}

class NeedsDependency
{
    ISample _someSample;
    public NeedsDependency(ISample someSample)
    {
        _someSample = someSample;
    }
}


// *** Controllor - ApplicationStartup - other ***
// Here I have not idea how to build ISample dependency

@@ EDIT 
// *** button click event handler ***
// Ok, here I know how to create ParamForBuilderISample, 
// hence I can call MyISampleFactory, then, I can Use NeedDependency class:
ParamForBuilderISample obj = new ...
obj.SomeProperty = ...
obj.otherSomeProperty = ...
ISample sample = MyISampleFactory.Build(obj);
NeedDependency nd = new NeedDependency(sample);
// perfect, now my buttonClick can execute all what it wants
nd.DoSomething();
nd.DoOtherStuff();

我的场景适合依赖注入模式吗?如果是真的,我真的不知道如何构建我的模式。

与其使用构造函数注入来传递这个“运行时依赖项”,不如使用方法注入。这甚至可以完全消除建立工厂的需要:

private只读示例;
公共MyController(ISample样本){
这个样本=样本;
}
公共字符串按钮\u单击\u事件\u处理程序(对象s、事件参数e){
ParamForBuilderISample obj=新建。。。
obj.SomeProperty=。。。
obj.otherSomeProperty=。。。
本品剂量测定法(obj);
}
您仍然需要在某个地方进行切换,但是您可以为
ISample
实现一个代理,而不是使用工厂:

public类SampleProxy:ISample
{
私有只读样本1样本1;
私有只读样本2样本2;
公共样本代理(样本1样本1、样本2样本2){
this.sample1=sample1;
this.sample2=sample2;
}
public void DoSomething(ParamForBuilderISample param){
这个.GetSampleFor(param).DoSomething(param);
}
private ISample GetSampleFor(ParamForBuilderISample参数){
//如果obj.someProperty==“.”返回this.sample1;
//如果obj.someProperty==“--”,则返回this.sample2;
//否则如果。。。
}
}

您的
ParamForBuilderISample
看起来像一个。依赖注入并没有消除对方法参数的需要。数据仍应通过方法传递。

我不理解您的示例。我知道如何仅在代码隐藏中生成ParamForBuilderISample实例。您使用了一种动作方法(这是什么?),但动作方法什么都不知道。最后,您说:“依赖项注入并没有消除使用方法参数的需要”,但我仍然不知道如何做到这一点。为了更好地澄清我的问题,我编辑了我文章的代码段。请参见@编辑word。