Несколько Интерфейсная инжекция с замком Виндзор

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

db_words = set([x for x in db.split() if len(x) > 4])
lp_words = set([x for x in lp.split() if len(x) > 4])

matches = db_words & lp_words

Если вы хотите исключить слова одного и того же символа, вы можете определить понимание списка следующим образом:

[x for x in db.split() if len(x) > 4 and x != x[0]*len(x)]

Если вы ищете любую последовательную последовательность [ 113] символов, которые соответствуют, это может работать лучше:

i_skip = set()  # characters to skip if they are already in a printed word
j_skip = set()

for i in range(len(db)-4):
    if i in i_skip: continue
    for j in range(len(lp)-4):
        if j in j_skip: continue
        if db[i] == lp[j]:
            word_len = 5
            while db[i:i+word_len] == lp[j:j+word_len]:
                if db[i:i+word_len+1] == lp[j:j+word_len+1]:
                    word_len += 1
                else:
                    print(db[i:i+word_len])
                    i_skip.update(range(i, i+word_len))
                    j_skip.update(range(j, j+word_len))
                    break
8
задан pythonandchips 24 November 2008 в 09:59
поделиться

3 ответа

Как David сказал, Вы не можете, но IHandlerSelector позволит Вам взять на себя управление. Проверьте тесты для понимания то, как использовать их: https://svn.castleproject.org/svn/castle/trunk/InversionOfControl/Castle. Виндзор. Tests/HandlerSelectorsTestCase.cs

В основном Вы сделали бы что-то как:

public class WritenExamHandler : IHandlerSelector
    {
        public bool HasOpinionAbout(string key, Type service)
        {
            // Decision logic here
            return somethingThatWouldBeTrueToSelectWritenExam && service == typeof(IExamCalc);
        }

        public IHandler SelectHandler(string key, Type service, IHandler[] handlers)
        {
            return handlers.Where(handler => handler.ComponentModel.Implementation == typeof (WritenExam)).First();
        }
    }

и затем Вы регистрируете его в:

container.Kernel.AddHandlerSelector(new WritenExamHandler());

Это позволит Вам легко заниматься multi-tenency проблемами :)

12
ответ дан 5 December 2019 в 10:44
поделиться

Короткий ответ, Вы не можете. Этот предпочтительный вид зависит от кода приложения, поэтому если Вы просто сделали container.Resolve<IExamCalc>, затем Виндзор не мог знать, какой Вы хотели.

Вопрос спросить состоит в том, как Вы знаете который тип использовать?

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

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

Все Ваши компоненты имеют ключи, которые являются уникальными строками, таким образом, Вы всегда можете так a container.Resolve("someKey") получить определенную реализацию.

Если Вы хотите иметь определенную реализацию, автоматически введенную, можно настроить компонент как это (от моей памяти, может не быть на 100% точным):

<component id="someService.customer1" service="ISomeService" type="Customer1SomeService" />

<component id="anotherId" service="IAnotherService" type="AnotherService">
    <parameters>
        <parameterName> <!-- as written in the ctor's signature -->
           ${someService.customer1}
        </parameterName>
    </parameters> 
</component>
3
ответ дан 5 December 2019 в 10:44
поделиться