Project Windsor - 存储库扩展DataContext

时间:2009-11-09 13:37:04

标签: asp.net-mvc castle-windsor ioc-container

在开始之前,我会这样说:我在我的存储库中扩展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

3 个答案:

答案 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。