asp.net-mvc - 项目 Windsor - 存储库扩展 DataContext

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

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

相关文章:

javascript - 填充每行前面的复选框,并使用 json 和 jquery 发送选中/未选中的值和 ID

.net - 温莎城堡的延迟加载服务

c# - CaSTLe Windsor 注册的类型不同于类型发现中使用的类型

caSTLe-windsor - 使用 Windsor 注入(inject)应用程序设置

c# - 仍然需要帮助理解为什么 Ninject 可能比手动 DI 更好

c# - caSTLe-windsor 中的多装饰器模式

javascript - C# 中的 HttpPostedFileBase docx 到字符串 - MVC

asp.net - 需要向第三方提供有关 REST URL 的建议以访问我的网站

html - Telerik MVC 网格事件编辑/添加

unity-container - 统一容器: create child container around every method call