Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.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
Dependency injection 具有运行时值的Structuremap配置…,用于<;IPProductProvider>;()使用<;ProductProvider>;。克托尔<;字符串>;(“connectionString”)是(someValueAtRunTime);_Dependency Injection_Structuremap_Dbcontext - Fatal编程技术网

Dependency injection 具有运行时值的Structuremap配置…,用于<;IPProductProvider>;()使用<;ProductProvider>;。克托尔<;字符串>;(“connectionString”)是(someValueAtRunTime);

Dependency injection 具有运行时值的Structuremap配置…,用于<;IPProductProvider>;()使用<;ProductProvider>;。克托尔<;字符串>;(“connectionString”)是(someValueAtRunTime);,dependency-injection,structuremap,dbcontext,Dependency Injection,Structuremap,Dbcontext,结构图专家 我在stackoverflow上找到了这篇文章 有人建议使用StructureMap配置的运行时值如下 For<IProductProvider>().Use<ProductProvider>.Ctor<string>("connectionString").Is(someValueAtRunTime); For().Use.Ctor(“connectionString”)是(someValueAtRunTime); 但这个例子不足以理解它的

结构图专家

我在stackoverflow上找到了这篇文章

有人建议使用StructureMap配置的运行时值如下

For<IProductProvider>().Use<ProductProvider>.Ctor<string>("connectionString").Is(someValueAtRunTime);
For().Use.Ctor(“connectionString”)是(someValueAtRunTime);
但这个例子不足以理解它的声明和用法。我也尝试在StructureMap网站上查找,但没有太多帮助


在我的情况下,我想将concrete DbContext(IDbContext)的依赖关系传递给该类的构造函数,并在该类的运行时动态创建连接字符串。

您发布的代码应该放在StructureMap的设置代码中,可以放在Initialize/Configure方法或注册表中。设置代码通常在应用程序的生命周期中只执行一次。因此,如果在启动应用程序时知道连接字符串值,并且配置了StructureMap,则可以将发布的代码放入StructureMap的初始化中。如果以后才知道该值,则需要某种工厂方法

工厂方法可以这样做(在StructureMap配置代码中):

Func createContext=value=>{
/*基于值创建上下文*/
};
初始化(c=>{
For()。使用(createContext);
//你们其余的人。。。
});
现在,您可以在需要时使用Func创建上下文实例:

public class ProductProvider : IProductProvider
{
    private readonly Func<string, IDbContext> _contextCreator;
    public ProductProvider(Func<string, IDbContext> contextCreator)
    {
        _contextCreator = contextCreator;
    }

    public IEnumerable<Product> GetProducts(string someValue)
    {
        using(var context = contextCreator(someValue))
        {
            return SomeOperationOnThe(context);
        }
    }
}
公共类ProductProvider:IPProductProvider
{
私有只读Func_contextCreator;
公共产品提供者(Func contextCreator)
{
_contextCreator=contextCreator;
}
公共IEnumerable GetProducts(字符串someValue)
{
使用(var context=contextCreator(someValue))
{
返回someoperationon(上下文);
}
}
}

我终于设法让它工作了

我是怎么做到的

希望它能帮助一些人,感谢PHeiberg之前回答我的问题并为我指明正确的方向


接口定义


在结构图配置代码中定义函数

Func additionalCreditCard=value=>
ObjectFactory.With(“name”).EqualTo(value).GetInstance();

在ObjectFactory中添加以下配置。配置

ObjectFactory.Configure(配置=>
{
config.For().Use(附加信用卡);
});

并在代码中…

public class PaymentSystem
{
    private readonly Func<string, IAdditionalCreditCard> _addtionalCreditCard;
    private IAdditionalCreditCard _addCreditCard;

    public PaymentSystem(Func<string, IAdditionalCreditCard> additionalCredit)
    {
        _addtionalCreditCard = additionalCredit;
    }

    public string AddtionalSystemType()
    {
        _addCreditCard = _addtionalCreditCard("American Express");
        return _addCreditCard.GetName();
    }
}
公共类付费系统
{
私人只读功能附加信用卡;
私人IAdditionalCreditCard_add信用卡;
公共支付系统(Func additionalCredit)
{
_附加信用卡=附加信用卡;
}
公共字符串AddationalSystemType()
{
_addCreditCard=_AddationalCreditCard(“美国运通”);
return_addCreditCard.GetName();
}
}


@pheiberg and microship78感谢您发布此有用的答案。但是在最新版本的structuremap objectfactory中,您是否可以提供最新structuremap库的更新答案。多谢各位much@Pheiberg在Func createContext=value=>{//create dbcontext}中我还有一个问题,如果在类的构造函数中dbcontext需要连接字符串,我将如何初始化dbcontext?
public interface ICreditCard
{
    string GetName();
}

public interface IAdditionalCreditCard : ICreditCard
{
}

public class AdditionalCreditCard : IAdditionalCreditCard
{
    private readonly string _name;

    public AdditionalCreditCard(string name)
    {
        _name = name;
    }

    public string GetName()
    {
        return _name;
    }
}
Func<string, IAdditionalCreditCard> additionalCreditCard = value =>
  ObjectFactory.With("name").EqualTo(value).GetInstance<AdditionalCreditCard>();
ObjectFactory.Configure(config =>
{
    config.For<Func<string, IAdditionalCreditCard>>().Use(additionalCreditCard);
});
public class PaymentSystem
{
    private readonly Func<string, IAdditionalCreditCard> _addtionalCreditCard;
    private IAdditionalCreditCard _addCreditCard;

    public PaymentSystem(Func<string, IAdditionalCreditCard> additionalCredit)
    {
        _addtionalCreditCard = additionalCredit;
    }

    public string AddtionalSystemType()
    {
        _addCreditCard = _addtionalCreditCard("American Express");
        return _addCreditCard.GetName();
    }
}