Замок Windsor к Единице - можно ли автоматически конфигурироваться в Единице тем же путем, Вы можете в CW?

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

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

спасибо.

6
задан Julian Dominguez 5 June 2013 в 20:40
поделиться

4 ответа

Круто. Эта функция еще не находится в единице, но если бы Вы чувствовали себя немного амбициозными, то Вы могли бы установить свою собственную основанную на конвенции регистрацию. Найденный ниже отрезанный, который работает на выполняющийся блок и интерфейсы. Удачи.

P.S. Это чувствует себя подобно большому взлому, я, вероятно, продолжил бы просто регистрировать все типы вручную.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Reflection;

namespace Forum
{
    class Program
    {
        static void Main(string[] args)
        {
            // get your assemblies and types you can register
            Assembly a = Assembly.GetExecutingAssembly();
            var types = a.GetTypes();            
            var bindTo = from t in types
                         where t.IsAbstract || t.IsInterface
                         select t;

            // apply your conventions to filter our types to be registered
            var interfacePairs = from t in bindTo.Where(x => x.IsInterface)
                                 let match = types.FirstOrDefault(x => x.Name ==     t.Name.Substring(1))
                                 where match != null
                                 select new Pair { To = t, From = match };
            var abstractPairs = new Pair[] {};


            // setup the generic form of the method to register the types
            var thisType = typeof(Program);
            var bindings = BindingFlags.Static | BindingFlags.Public;
            MethodInfo genericMethod = thisType.GetMethod("RegisterType", bindings);            

            // register all your types by executing the 
            // specialized generic form of the method
            foreach (var t in interfacePairs.Concat(abstractPairs))
            {
                Type[] genericArguments = new Type[] { t.To, t.From };
                MethodInfo method = genericMethod.MakeGenericMethod(genericArguments);
                method.Invoke(null, new object [] {});
            }

            Console.ReadKey();
        }

        public static void RegisterType<To, From>()
        {
            Console.WriteLine("Register { To: {0} From: {1} }", typeof(To), typeof(From));
        }

        // Test classes that should be picked up
        interface ITest { }
        class Test : ITest { }

        class Pair
        {
            public Type To { get; set; }
            public Type From { get; set; }
        }        
    }
}
0
ответ дан 17 December 2019 в 02:34
поделиться

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

-1
ответ дан 17 December 2019 в 02:34
поделиться

Check this out:

        var container = new UnityContainer();

        container
            .ConfigureAutoRegistration()
            .LoadAssemblyFrom("Plugin.dll")
            .IncludeAllLoadedAssemblies()
            .ExcludeSystemAssemblies()
            .ExcludeAssemblies(a => a.GetName().FullName.Contains("Test"))
            .Include(If.Implements<ILogger>, Then.Register().UsingPerCallMode())
            .Include(If.ImplementsITypeName, Then.Register().WithTypeName())
            .Include(If.Implements<ICustomerRepository>, Then.Register().WithName("Sample"))
            .Include(If.Implements<IOrderRepository>,
                     Then.Register().AsSingleInterfaceOfType().UsingPerCallMode())
            .Include(If.DecoratedWith<LoggerAttribute>,
                     Then.Register()
                            .AsInterface<IDisposable>()
                            .WithTypeName()
                            .UsingLifetime<MyLifetimeManager>())
            .Exclude(t => t.Name.Contains("Trace"))
            .ApplyAutoRegistration();
5
ответ дан 17 December 2019 в 02:34
поделиться

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

В прошлом году я написал расширение для регистрации на основе соглашений для Unity, о котором вы можете прочитать здесь . Фактическая загрузка доступна в Google с кодом здесь . Основное использование:

  _container
        .Using<IConventionExtension>()
        .Configure(x =>
            {
                x.Conventions.Add<InterfaceImplementionNameMatchConvention>();
                x.Assemblies.Add(Assembly.GetExecutingAssembly());
            })
        .Register();

Существует также ClosingTypeConvention для автоматической регистрации открытых универсальных типов:

  _container
                .Using<IConventionExtension>()
                .Configure(x =>
                    {
                        x.Conventions.Add(new ClosingTypeConvention(typeof (IRepository<>)));
                        x.Assemblies.Add(Assembly.GetExecutingAssembly());
                    })
                .Register();
0
ответ дан 17 December 2019 в 02:34
поделиться
Другие вопросы по тегам:

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