У нас есть пара мини-приложений (один материал для поиска в веб-формах), которые должны запускаться в контексте гораздо более крупного сайта и приложения (далее - «Монолит»)
Мы не хотим устанавливать Monolith на машину каждого разработчика, поэтому мы хотим, чтобы некоторые разработчики могли разрабатывать эти небольшие приложения в своем собственном изолированном проекте с песочницей (далее «Песочница»). Идея состоит в том, что мы переместим (1) полученную DLL и (2) файл веб-формы (aspx) из песочницы в монолитное веб-приложение, где оно будет работать.
Это все хорошо, за исключением того, что пара этих маленьких приложений должна использовать элемент управления, который существует в Monolith. И этот контроль не будет работать без всей инфраструктуры Монолита за ним.
Итак, у нас была прекрасная идея создать макет контроля. Мы удалили элемент управления с тем же пространством имен, именем класса и свойствами, что и элемент управления в Monolith. Мы скомпилировали это в DLL и поместили в Песочницу. Мы можем развиваться против этого, и он просто выплевывает данные типа Lorem Ipsum, что круто.
Единственная ссылка на элемент управления:
<Namespace:MyControl runat="server"/>
В Песочнице это вызывает фиктивный объект. В Монолите это вызывает фактический контроль. Мы поняли, что, поскольку единственное соединение с элементом управления - это тег выше, он должен работать с обеих сторон. Во время выполнения он просто вызывает разные вещи, в зависимости от того, где он запущен.
Итак, мы переместили файл aspx и DLL приложения (, а не DLL фиктивного объекта) в Monolith ... и он не запустился.
Кажется, мы не рассчитывали на файл "mypage.aspx.designer.cs", выходящий из Visual Studio. Это скомпилировано в DLL, и оно имеет ссылку на нашу библиотеку фиктивных объектов. Поэтому, когда он работает в Monolith, он жалуется, что не может загрузить библиотеку фиктивного объекта.
Итак, наша цель состоит в том, чтобы иметь тег управления, как указано выше, и вызывать разные вещи в зависимости от среды. В обоих случаях он будет выполнять одно и то же пространство имен и класс, но это пространство имен и класс будут разными в двух средах . В Монолите это был бы наш фактический контроль. В Песочнице это будет наш фиктивный объект.
По сути, мы хотим, чтобы этот тег оценивался во время выполнения, а не во время компиляции. Мы хотим, чтобы в DLL не было никаких ссылок на DLL фиктивного объекта.
возможно? Другие решения для основной проблемы?
Решение
В конце концов, это было довольно просто.
Я работаю над своим приложением с элементом управления, который скомпилирован с моей библиотекой фиктивного объекта. Когда я готов к компиляции в последний раз, я удаляю ссылку на библиотеку фиктивного объекта и добавляю ссылку на библиотеку Monolith DLL . Затем я компилирую и использую эту DLL.
Полученная DLL не имеет ни малейшего представления, что она не была разработана против Monolith DLL все время.