2

在开始之前,我会说:我必须在我的存储库中进行扩展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);
  }
}

但是,container如果 web.config 中没有任何内容,则不需要?

4

3 回答 3

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

于 2009-11-09T14:03:31.230 回答
1

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

于 2009-11-09T13:53:08.940 回答
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。

于 2009-11-22T00:34:56.120 回答