2011-01-06 2 views
1

Я использую webforms, и мне интересно, как я могу удалить последующую конкретную ссылку на репозиторий. Раньше я использовал виндзор с замком с MVC, но я не думаю, что могу использовать это здесь?Удаление зависимости от конструктора

код позади:

ICustomerRepository repos; 

public Workout_Admin() 
    // here is the offending concrete implementation 
    : this(new SqlCustomerRepository()) { } 

public Workout_Admin(ICustomerRepository repos) 
{ 
    this.repos = repos; 
} 

ОБНОВЛЕНО ---

Я обновил статический метод как suggeted, а также добавление дополнительного кода на завод Виндзоре

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); 
    } 

    CommonServiceLocatorPageHandlerFactory.Container = container; 
} 

Проблема, которая сохраняется, заключается в загрузке сборки из файла конфигурации. CommonServiceLocatorPageHandlerFactory входит в состав и сборка под названием yourfit, папка с именем factory. А вот соответствующие конфиги

<httpHandlers> 
    <add verb="*" path="*.aspx" 
    type="YourFit.Factory.CommonServiceLocatorPageHandlerFactory, YourFit"/> 
</httpHandlers> 
<handlers> 
    <remove name="UrlRoutingHandler"/>   
    <add name="CSLPageHandler" verb="*" path="*.aspx" 
     type="YourFit.Factory.CommonServiceLocatorPageHandlerFactory, YourFit"/> 
</handlers> 

и ошибка:

Не удалось загрузить тип «YourFit.Factory.CommonServiceLocatorPageHandlerFactory» из сборки «YourFit».

Я знаю, что, скорее всего, я действительно глуп. Большое спасибо за ваше время.

ответ

1

Вы можете это сделать. Однако в компиляторе ASP.NET требуется конструктор по умолчанию, но вы можете защитить его. Вы можете вводить зависимости в другом конструкторе, задавая настраиваемый PageHandlerFactory, который вводит зависимости в перегруженном (открытом) конструкторе. Ваш класс будет выглядеть следующим образом:

public class Workout_Admin : Page 
{ 
    ICustomerRepository repos; 

    protected Workout_Admin() { } 

    public Workout_Admin(ICustomerRepository repos) 
    { 
     this.repos = repos; 
    } 
} 

Here is an article, который показывает вам, как это сделать (для замок Виндзор, просто изменить код в методе GetInstance позвонить контейнер Windsor). Обратите внимание, что для этого вам нужно полностью доверять.

UPDATE

Вы можете изменить private static object GetInstance(Type type) метод, который описывается в этой статье к следующему:

public static IWindsorContainer Container; 

private static object GetInstance(Type type) 
{ 
    return Container.Resolve(type); 
} 

В пути запуска вашего приложения (где вы настроить контейнер замок Виндзор) вы чем должен установить статическое значение Container:

// Create 
IWindsorContainer container = ... 

// Configure 

// Set container to page handler factory 
CommonServiceLocatorPageHandlerFactory.Container = container; 

Надеюсь, это имеет смысл.

+0

Вы также можете взглянуть на этот вопрос: http://stackoverflow.com/questions/293790/how-to-use-castle-windsor-with-asp-net-web-forms. – Steven

+0

Спасибо. В настоящее время я смотрю, как получить dll для Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance – hoakey

+0

В статье он говорит: «Я намеренно использую CSL для этого, потому что моя библиотека« Локатор сервисов »зависит от этого интерфейса. вы не используете CSL, изменение кода для работы с вашей библиотекой IoC можно сделать, изменив одну строку, как вы увидите ниже ». Он, похоже, не показывает пример. Поэтому, когда я запускаю его, я получаю сообщение об ошибке «Не удалось загрузить CSL или сборку CSL или одну из ее зависимостей». Есть идеи? – hoakey

Смежные вопросы