Аспект CodeFluent для полнотекстового индекса

Я пытаюсь разработать аспект CodeFluent, чтобы установить свойство объекта как полнотекстовый индекс.

Я нашел эту ссылку, которая делает что-то похожее на то, к чему я стремлюсь. http://blog.codefluententities.com/2012/11/27/using-the-sql-server-template-producer-to-generate-clustered-indexes/

Однако для этого используется производитель шаблонов SQL. Можно ли в любом случае установить свойство как полнотекстовый индекс полностью в самом аспекте, поэтому мне не нужно устанавливать/обслуживать как производителя шаблонов, так и аспект для всех проектов?

Вот код аспекта С#, который у меня есть до сих пор:

    public class FullTextIndexing : IProjectTemplate
    {
        public static readonly XmlDocument Descriptor;
        public const string Namespace = "http://www.softfluent.com/aspects/samples/FullTextIndexing";

        static FullTextIndexing()
        {
            Descriptor = new XmlDocument();
            Descriptor.LoadXml(
@"<cf:project xmlns:cf='http://www.softfluent.com/codefluent/2005/1' defaultNamespace='FullTextIndexing'>
    <cf:pattern name='Full Text Indexing' namespaceUri='" + Namespace + @"' preferredPrefix='fti' step='Tables'>
        <cf:message class='_doc'>CodeFluent Full Text Indexing Aspect</cf:message>
        <cf:descriptor name='fullTextIndexing'
            typeName='boolean'
            category='Full Text Indexing'
            targets='Property'
            defaultValue='false'
            displayName='Full-Text Index'
            description='Determines if property should be full text indexed.' />
    </cf:pattern>
</cf:project>");
        }

        public Project Project { get; set; }

        public XmlDocument Run(IDictionary context)
        {
            if (context == null || !context.Contains("Project"))
            {
                // we are probably called for meta data inspection, so we send back the descriptor xml
                return Descriptor;
            }

            // the dictionary contains at least these two entries
            Project = (Project)context["Project"];

            // the dictionary contains at least these two entries
            XmlElement element = (XmlElement)context["Element"];
            Project project = (Project)context["Project"];

            foreach (Entity entity in project.Entities)
            {
                Console.WriteLine(">>PROPERTY LOGGING FOR ENTITY "+entity.Name.ToUpper()+":<<");
                foreach (Property property in entity.Properties)
                {
                    Log(property);
                    if(MustFullTextIndex(property))
                    {
                        Console.WriteLine("CHANGING PROPERTY");
                        property.TypeName = "bool";
                        Log(property);
                    }
                }
            }

            // we have no specific Xml to send back, but aspect description
            return Descriptor;
        }

        private static bool MustFullTextIndex(Property property)
        {
            return property != null && property.IsPersistent && property.GetAttributeValue("fullTextIndexing", Namespace, false);
        }

        private static void Log(Property property)
        {
            Console.WriteLine(property.Trace());
        }
    }

ИЗМЕНИТЬ ПЕРВОЕ:

Следуя ответу Meziantou, я пытаюсь создать производителя шаблонов, но он дает мне ошибки компиляции, когда я пытаюсь добавить нового производителя шаблонов в список производителей проектов, поэтому я, вероятно, делаю это неправильно.

Ошибка говорит:

Cannot convert type 'CodeFluent.Model.Producer' to 'CodeFluent.Producers.SqlServer.TemplateProducer'

Вот код, который у меня есть до сих пор:

public XmlDocument Run(IDictionary context)
{
    if (context == null || !context.Contains("Project"))
    {
        // we are probably called for meta data inspection, so we send back the descriptor xml
        return Descriptor;
    }

    // the dictionary contains at least these two entries
    XmlElement element = (XmlElement)context["Element"];
    Project project = (Project)context["Project"];

    CodeFluent.Producers.SqlServer.TemplateProducer producer = new CodeFluent.Producers.SqlServer.TemplateProducer();
    producer.AddNamespace("CodeFluent.Model");
    producer.AddNamespace("CodeFluent.Model.Persistence");
    producer.AddNamespace("CodeFluent.Producers.SqlServer");

    Console.WriteLine(producer.Element);
    //TODO: Need to figure out how to modify the actual template's contents

    project.Producers.Add(producer); //Error happens here


    // we have no specific Xml to send back, but aspect description
    return Descriptor;
}

person MTran    schedule 10.03.2016    source источник


Ответы (1)


В примере кода аспект используется только потому, что у него есть дескриптор. Дескрипторы используются объектами CodeFluent для заполнения сетки свойств:

<cf:descriptor name="IsClusteredIndex" typeName="boolean" targets="Property" defaultValue="false" displayName="IsClusteredIndex" />

Поэтому, когда вы устанавливаете для этого свойства значение true или false, атрибут xml ns:IsClusteredIndex добавляется или удаляется из xml-файла.

Затем шаблон SQL считывает значение атрибута для создания ожидаемого файла SQL:

property.GetAttributeValue("sa:IsClusteredIndex", false)

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

Если ваша цель — интегрироваться в графический интерфейс, вам нужен аспект (XML или DLL) или производитель. Если вы не хотите создавать производителя, вы можете встроить шаблон в свой аспект. Во время сборки вы можете извлечь шаблон SQL и добавить в проект производителя шаблонов SQL, таким образом, все находится в аспекте.

person meziantou    schedule 10.03.2016
comment
Это именно мой вопрос. Как я могу поместить все, что обычно находится в производителе шаблонов, в Aspect? - person MTran; 10.03.2016
comment
Вы можете добавить продюсера в проект, используя Project.CreateProducer или Project.Producers.Add. Вы хотите добавить продюсера CodeFluent.Producers.SqlServer.TemplateProducer. - person meziantou; 10.03.2016
comment
Чтобы добавить существующий экземпляр производителя, вы можете использовать Producer.CreateProducer(project, "My producer", producer) - person meziantou; 11.03.2016
comment
Благодаря meziantou, теперь мне удалось создать производителя шаблонов и добавить его в проект с помощью Aspect. Но могу ли я полностью указать файл шаблона SQL в коде аспекта? Если да, то как мне это сделать? - person MTran; 12.03.2016
comment
Вы можете добавить файл SQL в свой аспектный проект в качестве встроенного ресурса и извлечь этот ресурс в папку во время сборки (например, в %TEMP%\MyAspect\[Template]file.sql). Затем вы можете установить эту папку в качестве исходного каталога производителя шаблонов. - person meziantou; 12.03.2016
comment
Спасибо, meziantou, теперь у меня все работает после долгих проб и ошибок. - person MTran; 26.04.2016