В нашем обновлении до ServiceStack v5.7 файл, сгенерированный NativeTypesService в /types/csharp
, теперь генерирует неверный код. Мы используем ASP. Net (НЕ Core),. Net Framework 4.7.2.
В частности, атрибуты References
и StringLength
создаются с именованными параметрами, что приводит к ошибкам при включении в клиентский проект (с использованием той же версии ServiceStack):
error CS1729: 'StringLengthAttribute' does not contain a constructor that takes 0 arguments
error CS7036: There is no argument given that corresponds to the required formal parameter 'type' of 'ReferencesAttribute.ReferencesAttribute(Type)'
Я проверил историю обвинений соответствующего бита CSharpGenerator
, но за годы ничего не изменилось. Я в растерянности.
Как мы можем сгенерировать действительный код, используя конечную точку /types/csharp
NativeTypesService?
Я создал минимальный пример проекта ниже, чтобы проиллюстрировать это. Все библиотеки ServiceStack v5.7 (текст, интерфейсы и т. Д. c.). Когда мы понижаем только ядро ServiceStack
до v5.6, генерируется ожидаемый результат.
v5.6 Подпись
namespace TestTypes
{
[Route("/Child")]
public partial class Child
{
public virtual int Id { get; set; }
[References(typeof(TestTypes.Parent))]
public virtual int ParentId { get; set; }
}
[Route("/Parent")]
public partial class Parent
{
public virtual int Id { get; set; }
[StringLength(100)]
public virtual string Name { get; set; }
}
}
v5.7 Подпись
namespace TestTypes
{
[Route("/Child")]
public partial class Child
{
public virtual int Id { get; set; }
[References(Type=typeof(TestTypes.Parent))]
public virtual int ParentId { get; set; }
}
[Route("/Parent")]
public partial class Parent
{
public virtual int Id { get; set; }
[StringLength(MaximumLength=100)]
public virtual string Name { get; set; }
}
}
Пример проекта
public class AppHost : AppHostBase
{
public AppHost() : base("Test", typeof(MyService).Assembly) { }
public override void Configure(Container container) { }
}
public class MyService : Service
{
public object Get(Parent request) { return null; }
public object Get(Child request) { return null; }
}
[Route("/Parent")]
public class Parent
{
[PrimaryKey]
public int Id { get; set; }
[StringLength(100)]
public string Name { get; set; }
}
[Route("/Child")]
public class Child
{
[PrimaryKey]
public int Id { get; set; }
[References(typeof(Parent))]
public int ParentId { get; set; }
}