代码之家  ›  专栏  ›  技术社区  ›  Kieran Senior

Windsor项目-存储库扩展DataContext

  •  2
  • Kieran Senior  · 技术社区  · 16 年前

    在开始之前,我要说:我 延长 DataContext 在我的存储库中,因为我调用存储过程和 ExecuteMethodCall 只提供 内部 .许多人似乎不知道这一点,所以请不要说“只是不扩展DataContext”。

    我刚刚开始使用温莎作为我的IoC容器。我的控制器愉快地执行以下操作:

    public ContractsControlController(IContractsControlRepository contractsControlService)
    {
        _contractsControlRepository = contractsControlService;
    }
    

    但我的存储库必须具有以下构造函数:

    public ContractsControlRepository()
      : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }
    

    但是IoC容器可以让您为web中的存储库指定连接字符串。配置。要做到这一点,存储库中的构造函数必须是什么样子?如果我没有指定我展示的构造函数,那么它会抱怨没有接受零参数的构造函数。

    干杯

    编辑

    在全球。尽快。反恐精英

    ControllerBuilder.Current.SetControllerFactory(new 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);
      }
    }
    

    但是 container 如果网络中没有任何东西,则不需要。配置?

    3 回复  |  直到 16 年前
        1
  •  2
  •   Mark Seemann    16 年前

    大卫·坎普的建议很简洁,但不是类型安全的。更复杂但类型安全的方法是使用工厂方法。

    假设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添加到容器中。

        2
  •  1
  •   Community Mohan Dere    9 年前

    看看 this question 了解如何提供参数构造函数。

        3
  •  0
  •   Venemo    16 年前

    它的工作原理是这样的:您可以将存储库配置为任何其他组件,但也可以在配置中提供所需的连接字符串作为参数。

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