Hi All!
А что может сказать многоуважаемая общественность по возможности использования RFD совместно с COM+/Enterprise Services. И особенноинтересно в распределенной архитектуре, с вынесенным во внешний COM+ Application бизнес слоем (и потенциально на отдельную внешнюю машину)?
Попробовал я тут сделать простенкий тест (аналогичный хрестоматийному MS PetShop). BLL сделан как ServicedComponents в свою очередь ссылающийеся на DAL объекты, которе собственно используют RFD для получения данных. Данные, загружаемые через RFD, представлены простеньким классиком (даже не интерфейсом) ItemInfo с пятком строковых полей.
Так вот, при поптыке вызвать такой BLL — тут же получил по фейсу ексепшном (см ниже)

насколько я подозреваю, лезущий как раз от природы динамически генеримого RFD кода... (полный вид ругани в деталях – см ниже. Ключевые места выделены жирным). Впечатление как раз что тут и лезет как раз known issue RFD, что маппер создаёт наследуемый от абстрактного класса класс, полное имя которого отличается от оригинального и строится как NamespaceName.AbstractClassName.MappingExtension.AbstractClassName
тогда как COM+ похоже что пытается грузить по ссылке в асембли класс именуемый NamespaceName.AbstractClassName
Такое впечатление, что это ограничение практически означает невозможноть использования RFD совместно с Enterprise Services? Или я где-то ошибаюсь?
Есть ли у кого опыть реального использования RFD в распределенных архитектурах? Через COM+ или remoting? Если есть — хотелось бы услышать мнение о том насколько оно жизненно с RFD. А то как-то грустно получается — вроде как фремворчина красивая и удобная, а и не заюзать толком
Спасибо,
Александр.
Configuration Error
Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.
Parser Error Message: The located assembly's manifest definition with name 'Fd.Model.ItemInfo.MapDescriptor' does not match the assembly reference.
Source Error:
Line 198: <add assembly="System.EnterpriseServices, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
Line 199: <add assembly="System.Web.Mobile, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
Line 200: <add assembly="*"/>
Line 201: </assemblies>
Line 202: </compilation>
Source File: c:\windows\microsoft.net\framework\v1.1.4322\Config\machine.config Line: 200
Assembly Load Trace: The following information can be helpful to determine why the assembly 'Fd.Model.ItemInfo.MapDescriptor' could not be loaded.
=== Pre-bind state information ===
LOG: DisplayName = Fd.Model.ItemInfo.MapDescriptor
(Partial)
LOG: Appbase =
file:///D:/Documents/AW/Tests/RfdTry/Fd/FdWeb
LOG: Initial PrivatePath = bin
Calling assembly : (Unknown).
===
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Post-policy reference: Fd.Model.ItemInfo.MapDescriptor
LOG: Attempting download of new URL
file:///C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/Temporary ASP.NET Files/fd/7efe3233/7178912e/
Fd.Model.ItemInfo.MapDescriptor.DLL.
LOG: Attempting download of new URL
file:///C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/Temporary ASP.NET Files/fd/7efe3233/7178912e/
Fd.Model.ItemInfo.MapDescriptor/Fd.Model.ItemInfo.MapDescriptor.DLL.
LOG: Attempting download of new URL
file:///D:/Documents/AW/Tests/RfdTry/Fd/FdWeb/bin/Fd.Model.ItemInfo.MapDescriptor.DLL.
WRN: Comparing the assembly name resulted in the mismatch: NAME
________________________________________
Version Information: Microsoft .NET Framework Version:1.1.4322.573; ASP.NET Version:1.1.4322.573
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Аноним, Вы писали:
V>Может стоит выложить пример целиком?
Да в общем-то без проблем, все достаточно тривиально и до безобразия просто...
Сборка Model содержит примитивный entity классик
[Serializable]
public class ItemInfo
{
[MapField("ProductID")]
public string ItemID;
public string Category;
public string Name;
public string Descn;
}
Сборка DAL содержит собственно загрузку коллекции этих самых entities
public class Item
{
public ArrayList GetItems()
{
using (DbManager db = new DbManager("Fd"))
{
return db
.SetCommand(@"
SELECT
ProductID,
Category,
Name,
Descn
FROM Product
ORDER BY Name")
.ExecuteList(typeof(ItemInfo));
}
}
}
Сборка BLL собственно является COM+ компонентом и не делает ничего умнее чем вызов DAL и возврат загруженой им коллекции
[Guid("EB0335AA-B9B4-46ba-87AF-C30495D466DF")]
public class Catalog : ServicedComponent
{
public Catalog()
{
}
public ArrayList GetItems()
{
Item itms = new Item();
return itms.GetItems();
}
}
Ну и наконец ASP.NET приложение, которое собственно дергает BLL.Catalog и пытается отрисовать элементы
public class Default : System.Web.UI.Page
{
...
private void Page_Load(object sender, System.EventArgs e)
{
Catalog cat = new Catalog();
ArrayList items = cat.GetItems();
foreach (ItemInfo itm in items)
...
}
...
}
Все сборки корректно подписаны, в COM+ зареганы. И такая вот простота не желает под COM+ работать, вылетая с вышеозначеным exception.
Если у кого есть идеи как побороть, буду крайне признателен.
Спасибо,
Александр.
Подправлено форматирование. IT
Уточнение курса... похоже что не работает только в случае активации COM+ компонента как Application. Если активацию ставить Library то работает, что не может не радовать. Однако переключение на Application вызывает тот самый сбой, и самое интересное что после этого, если переключить назад на Library, сбой остается! Лечится только полной вычисткой IIS и COM+ приложения, пересборкой и регистрацией компонента снова как Library. Вот так...
Напрашивается грустная мысль — в распределенной среде, с COM+ уровнем на внешней машине жить не будет скорее всего...