Domanda

miei regolatori nella mia applicazione ASP.NET MVC dipendono dalla IDataContext che è un wrapper per la sessione NHibnerate in modo che possa facilmente sostituire questo più tardi. Io uso il contenitore Microsoft Unità CIO per iniettare le mie dipendenze entro i costruttori delle mie classi.

Ho provato prima creato un FakeDataContext all'interno del mio progetto di test e messa a punto le dipendenze corrette come segue:

public class BaseControllerTest {
    [TestInitialize]
    public void Init() {
        // Create the ioc container
        var container = new UnityContainer();

        // Setup the common service locator (must come before any instance registered that use the common service locator such as membership provider)
        ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container));

        // Configure the container
        container.RegisterType<IDataContext, FakeDataContext>();
    }
}

Ora tutto quello che devo fare è ereditare da questa classe e tutto funziona bene, ma sento che il FakeDataContext non è il modo più preciso per effettuare le mie prove in modo che io sto cercando di creare un in seduta memoria utilizzando SQLite. Ho modificato il precedente per:

public class BaseControllerTest {
    private static Configuration _configuration;

    [TestInitialize]
    public void Init() {
        // Create the ioc container
        var container = new UnityContainer();

        // Configure the container
        container.RegisterType<ISessionFactory>(new ContainerControlledLifetimeManager(), new InjectionFactory(c => {
            return CreateSessionFactory();
        }));
        container.RegisterType<ISession>(new InjectionFactory(c => {
            var sessionFactory = container.Resolve<ISessionFactory>();
            var session = sessionFactory.OpenSession();
            BuildSchema(session);
            return session;
        }));
        container.RegisterType<IDataContext, NHibernateDataContext>();
    }

    private static ISessionFactory CreateSessionFactory() {
        return Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.InMemory())
            .Mappings(m => m.FluentMappings
                .AddFromAssembly(Assembly.GetExecutingAssembly())
                .Conventions.AddFromAssemblyOf<EnumConvention>())
            .ExposeConfiguration(c => _configuration = c)
            .BuildSessionFactory();
    }

    private static void BuildSchema(ISession session) {
        var export = new SchemaExport(_configuration);
        export.Execute(true, true, false, session.Connection, null);
    }
}

Tuttavia, questo genera l'errore "un invalido o configurazione incompleta è stato utilizzato durante la creazione di un SessionFactory.". Ho pensato che questo potrebbe essere perché le entità le mappature sono alla ricerca di sono in un progetto diverso dal progetto di test così ho provato dicendo Assembly.LoadFile ( "C: .. \ MyAssembly.dll")., Ma questo ancora non ha funzionato

Si prega di notare che ho usato il seguente articolo http://www.mohundro.com/blog/CommentView,guid,fa72ff57-5c08-49fa-979e-c732df2bf5f8.aspx per aiuto, ma non è esattamente quello che sto cercando.

sarei grato se qualcuno potesse aiutare. Grazie

È stato utile?

Soluzione

Problema risolto. Avevo bisogno di aggiungere un riferimento alla DLL SQLite. Ho cambiato anche la sessione di utilizzare l'aswell ContainerControlledLifetimeManager come la fabbrica della sessione. Si prega di correggere se c'è un modo più efficace per farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top