Dependency injection 具有运行时值的Structuremap配置…,用于<;IPProductProvider>;()使用<;ProductProvider>;。克托尔<;字符串>;(“connectionString”)是(someValueAtRunTime);
结构图专家 我在stackoverflow上找到了这篇文章 有人建议使用StructureMap配置的运行时值如下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); 但这个例子不足以理解它的
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();
}
}