Project Windsor - Расширение репозитория DataContext - PullRequest
2 голосов
/ 09 ноября 2009

Прежде чем я начну, я скажу следующее: у меня есть для расширения DataContext в моем хранилище, потому что я вызываю хранимые процедуры, а ExecuteMethodCall доступен только для внутреннего использования . Многие люди, кажется, этого не знают, поэтому, пожалуйста, не говорите «просто не расширяйте DataContext».

Я только начал использовать Windsor в качестве своего контейнера IoC. Мой контроллер с радостью делает следующее:

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

Но мой репозиторий должен иметь этот конструктор:

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

Но есть контейнер IoC, позволяющий вам указать строки подключения для вашего хранилища в файле web.config. Как должен выглядеть мой конструктор в репозитории для этого? Если я не укажу тот, который я показал, то он будет жаловаться, что нет конструкторов, которые бы принимали нулевые аргументы.

Приветствия

EDIT

В 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 ничего не происходит?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2009

Предложение Дэвида Кемпа лаконично, но небезопасно. Более сложным, но безопасным с точки зрения типа подходом будет использование фабричного метода.

Представьте, что класс 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.

1 голос
/ 09 ноября 2009

Посмотрите на этот вопрос , чтобы узнать, как предоставить конструкторы параметров.

0 голосов
/ 22 ноября 2009

Это работает так: вы настраиваете свой репозиторий как любой другой компонент, но вы также предоставляете необходимую строку подключения в качестве параметра в вашей конфигурации.

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

...