Каково Ваше использование реального мира для Аспектно-ориентированного программирования?

Добавьте этот фрагмент кода в метод __init__ класса сериализатора, как предложено в документах DRF :

class TestSerializer(serializers.ModelSerializer):
    user_req = UserSerializer(read_only=True)
    user_tar = UserSerializer(read_only=True)

    class Meta:
        model = TestAssoc
        fields = ("user_req", "user_tar")


    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        fields = kwargs.pop('fields', None)

        # Instantiate the superclass normally
        super(TestSerializer, self).__init__(*args, **kwargs)

        if fields is not None:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)

И так, когда вы вызываете сериализатор из views.py сделать это:

TestSerializer(queryset, fields=('user_req'))

В качестве альтернативы, вы можете определить класс

class DynamicFieldsModelSerializer(serializers.ModelSerializer):

    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        fields = kwargs.pop('fields', None)

        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)

        if fields is not None:
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)

Теперь импортируйте этот класс, если вы определили его в каком-то другом файле, а затем наследуйте его, используя [1113 ]

class TestSerializer(DynamicFieldsModelSerializer):

Таким образом:

class TestSerializer(DynamicFieldsModelSerializer):
    user_req = UserSerializer(read_only=True)
    user_tar = UserSerializer(read_only=True)

    class Meta:
        model = TestAssoc
        fields = ("user_req", "user_tar")

Теперь вы можете сделать

TestSerializer(queryset, fields=('user_req'))

Обновление
В представлениях. Возьмите пример ListAPIView

class DemoView(ListAPIView):
    queryset = TestAssoc.objects.all()

    def get(self, request):
        try:
            queryset = self.get_queryset()

            data = TestSerializer(queryset, fields=('user_req')).data

            return Response( {"data" : data } ,status=status.HTTP_200_OK)
        except Exception as error:
            return Response( { "error" : str(error) } , status=status.HTTP_500_INTERNAL_SERVER_ERROR)

8
задан Michael Myers 11 May 2009 в 21:39
поделиться

5 ответов

Управление транзакциями. Я знаю, что это каноническое использование АОП, но он действительно сияет, когда используется для этого.

И хотя у меня не было возможности использовать его в реальной ситуации, я считаю, что «советы вокруг» как НЕВЕРОЯТНО мощный, в частности, для того, чтобы упростить сложность кода за счет устранения необходимости во многих проверках на редкие условия.

2
ответ дан 5 December 2019 в 21:21
поделиться

Я согласен на Spring AOP.

AOSD (мы больше не говорим об АОП, я не совсем понимаю почему) действительно полезен для промежуточного программного обеспечения / сервис-ориентированной архитектуры, где у вас уже есть, по замыслу , некоторая модульность.

Я использовал его в этом контексте для услуг телефонии с некоторыми действительно ограниченными услугами биллинга.

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

На мой взгляд, одна из проблем - это языки pointcut, которые иногда бывает сложно описать, где именно вы хотите применить свой совет. Другая проблема - композиция, я не знаю, решена ли она, но может быть трудно понять, когда вы заказываете свои советы ....

1
ответ дан 5 December 2019 в 21:21
поделиться

АОП является обычным явлением, за исключением того, что люди редко называют его АОП. Посмотрите на все места в программировании .NET, где используются атрибуты. Атрибуты - это, по сути, сквозное поведение, которое может применяться ко многим классам / методам / параметрам.

В последнее время платформа ASP.NET MVC приняла активное использование атрибутов для широкого спектра сквозных компонентов, таких как безопасность, привязка данных и обработка исключений.

1
ответ дан 5 December 2019 в 21:21
поделиться

По моему опыту, Spring AOP кажется довольно распространенным явлением.

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

Я использовал это в ситуации, когда у меня есть один контроллер, и я добавляю, например, сервлет или веб-сервис. Я также использовал его для абстрагирования базы данных, чтобы соединения с базой данных и запросы, оптимизированные для базы данных, могли быть включены в приложение.

0
ответ дан 5 December 2019 в 21:21
поделиться

В настоящее время я использую AOP через EntLib / Unity в производстве для:

  • ведения журнала
  • кэширования
  • безопасности
  • отчетов об исключениях
  • счетчиков производительности

см. http://www.agileatwork.com/unit-of-work-with-unity-and-aspnet-mvc/ для реализации шаблона единицы работы с АОП

[UnitOfWork]
public void Process(Job job)
{
    ...
}
3
ответ дан 5 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: