在开始之前,我会这样说:我已在我的存储库中扩展DataContext
因为我正在调用存储过程而ExecuteMethodCall
仅在内部可用 。很多人似乎不知道这一点,所以请不要说“只是不要扩展DataContext”。
我刚刚开始使用Windsor作为我的IoC容器。我的控制器很乐意做到以下几点:
public ContractsControlController(IContractsControlRepository contractsControlService)
{
_contractsControlRepository = contractsControlService;
}
但是我的存储库必须有这个构造函数:
public ContractsControlRepository()
: base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }
但IoC容器允许您在web.config中为存储库指定连接字符串。为了做到这一点,我的存储库中的构造函数必须是什么样的?如果我没有指定我已经显示的那个,那么它会抱怨没有构造函数采用零参数。
干杯
修改
在global.asax.cs
中ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory());
WindsorControllerFactory.cs(在根目录中)
public class WindsorControllerFactory : DefaultControllerFactory
{
WindsorContainer container;
public WindsorControllerFactory()
{
container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes() where typeof(IController).IsAssignableFrom(t) select t;
foreach (Type t in controllerTypes)
{
container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
}
}
protected IController GetControllerInstance(Type controllerType)
{
return (IController)container.Resolve(controllerType);
}
}
但如果web.config中没有任何内容,则不需要container
答案 0 :(得分:2)
David Kemp的建议很简洁,但不是类型安全的。一种更复杂但类型安全的方法是使用工厂方法。
想象一下,ContractsControlRepository类已更改为在其构造函数中获取连接字符串。在这种情况下,你可以这样写:
var connectionString =
ConfigurationManager.ConnectionStrings
["AccountsConnectionString"].ConnectionString;
var container = new WindsorContainer();
container.AddFacility<FactorySupportFacility>();
container.Register(Component
.For<IContractsControlRepository>()
.UsingFactoryMethod(k => new ContractsControlRepository(connectionString)));
请注意,在UsingFactoryMethod方法起作用之前,必须将FactorySupportFacility添加到容器中。
答案 1 :(得分:1)
查看this question以了解如何提供参数构造函数。
答案 2 :(得分:0)
它的工作原理如下:您将存储库配置为任何其他组件,但您还在配置中提供了所需的连接字符串作为参数。
<component id="MyDataContext" service="yourservice" type="yourtype" lifestyle="singleton">
<parameters>
<connectionString>Data Source=localhost;Initial Catalog=YourCatalog;Integrated Security=SSPI</connectionString>
</parameters>
</component>
然后,将参数添加到您自己的DataContext的构造函数中,其名称为connectionString。