在开始之前,我要这样说:我必须在我的存储库中扩展DataContext
,因为我正在调用存储过程,并且ExecuteMethodCall
是仅内部可用。很多人似乎不知道这一点,所以请不要说“只是不要扩展 DataContext”。
我刚刚开始使用 Windsor 作为我的 IoC 容器。我的 Controller 愉快地执行以下操作:
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 中没有任何内容,则不需要容器
?
最佳答案
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)));
请注意,必须先将 FactorySupportFacility 添加到容器中,然后UsingFactoryMethod 方法才能起作用。
关于asp.net-mvc - 项目 Windsor - 存储库扩展 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1701030/