The Inquisitive Coder - Davy Brion’s Blog

Trying to walk that thin line between intelligence and ignorance

Archive for December, 2008

New Poll: What Do You Want To Read Here In 2009?

Posted by Davy Brion on 31st December 2008

Well, 2008 is just about over, so i figured i’d ask you guys what kind of stuff you’d like to read on this blog in 2009. The options (you can vote in the poll on the top right area of this page) are:

  • The same kind of topics as in 2008
  • More NHibernate related posts
  • Less NHibernate related posts
  • More introductory posts to various topics
  • More real world examples, problems and situations
  • More opinion posts
  • Less opinion posts
  • More information about NHibernate’s development

You can select up to 4 items if you want. I won’t promise anything, but i will try to keep the outcome of the vote into account :)

Any other suggestions or comments about what kind of stuff i should be writing about are always welcome of course.

Share/Save/Bookmark

Posted in About The Blog | 5 Comments »

What Would You Choose For New .NET Web Development?

Posted by Davy Brion on 29th December 2008

Web development in the .NET world has gotten a lot more interesting in the last couple of years. A few years ago, the only choice we had for a web front-end was ASP.NET WebForms. Nowadays you can add ASP.NET MVC and Silverlight to the mix. Obviously each option has its pro’s and con’s, so it’s not always clear which option should be used when you’re starting to build a new Web application.

Let’s start with ASP.NET WebForms. This is the option that has been available since the .NET platform was introduced, so there are already a lot of people experienced with it. There is also a ton of information available about the ins and outs of WebForms. And when it comes to commercial tool vendor support, it’s clearly miles ahead of the other options since there are lots of commercially supported controls available for it. Unfortunately, WebForms was originally created to offer a similar development model to WinForms developers. The code-behind files and the event-driven way of working is very similar to how you would write code in WinForms applications. Obviously, web applications and windows applications are completely different things, so you can’t reasonably expect the same way of working to be suitable for both.

Particularly, the Page and Control lifecycles are rather complex (at least much more complex than i would think they’d need to be) and often cause weird issues on complex pages. The event-driven model of both the Page class and the Control class (and its derivatives) seem to be the major cause of this. I think most WebForms developers have on more than one occasion spent long times debugging weird situations which were ultimately related to certain events triggering unexpected behavior in other controls on the same page. Granted, people with an in-depth knowledge of how these lifecycles really work don’t run into this as much, or are capable of avoiding these problems altogether.

You could indeed make the argument that most of the problems that people are experiencing with WebForms are caused by those people’s lack of understanding how it really works and how it really should be done. On the other hand, that is a pretty good sign that WebForms development isn’t intuitive or clear enough, and that while Microsoft has tried hard to make it easy to use, most people seem to solve their WebForms problems by hacking around their problems, or playing around with settings until it seems to work.

Another major problem with WebForms is that it doesn’t easily enable Test Driven Development. True, there are various patterns you can use to make sure you can write testable UI logic (up to a certain point anyway) but all in all, these approaches require more effort than should be necessary and you often end up wrapping a lot of stuff just to be able to test it. WebForms in general was never designed with testability in mind, and you will most definitely be confronted with that if you try to write testable UI code with WebForms.

As you can probably tell, i’m not a huge fan of WebForms. I think it’s fine for simple applications, but for anything beyond that i’d like to avoid it as much as possible.

Microsoft’s upcoming ASP.NET MVC framework aims to fix much of the issues i’ve mentioned above. It was designed with testability in mind, and although it’s not perfect either (depending on who you ask), it is certainly a huge improvement over WebForms when it comes to writing testable UI code. You also have a lot more options when it comes to having the framework behave the way you’d like it to. Another important benefit is the fact that ASP.NET MVC kinda forces you to structure your code in a much more sane manner. You put as little logic as possible in the views, and you put most of it in the Controllers where it belongs. Obviously, that doesn’t mean you should put business logic in the Controllers!

One of the downsides of ASP.NET MVC is that, due to its completely different way of working compared to WebForms, it comes with a much higher learning curve. Experienced WebForms developers might struggle with it at first, and might even be frustrated because most of their hard-earned WebForms experience no longer gives them a benefit. Some will probably enjoy it much more than WebForms, and some will probably dislike it strongly because it’s so different. Another downside is that there are far less commercial tool vendors that are offering ASP.NET MVC controls, at least compared to WebForms. Although that might not be that big of an issue, since i suspect that it’s easier to develop nice looking and reusable controls yourself when using ASP.NET MVC than it is to do so when using WebForms.

If you’re starting out with ASP.NET MVC, i think it’s safe to assume that you won’t proceed as quickly as you’re used to at first. But once you’re used to the new way of working, i’m pretty sure that it enables you to rapidly implement new pages and new functionality in a very clean way. For true web applications, i would probably pick ASP.NET MVC everytime, unless you don’t have the room to get over the learning curve. Also, when combined with a client-side javascript library like JQuery, this approach seems very compelling. Yes, i know you can use JQuery with WebForms as well, but it just seems to lend itself better to the MVC approach.

And then there’s Silverlight. There are already a couple of reasons why people would not want to use Silverlight for web applications. For starters, even though the application is running in a browser, it’s not really a true web application is it? Your users can’t bookmark pages, using the back button leads to unexpected behavior, there aren’t that many options for Search Engine Optimization, etc… However, if your only web-related requirement is that your application needs to run in a browser, without having to worry about any of the typical expected requirements for web applications, then Silverlight is a pretty interesting choice as well. You can very easily create very rich applications, with possibilities that are either impossible, or extremely difficult to do with typical web development platforms.

Our Genesis web front-end is developed in Silverlight. The UI not only looks great, but you can navigate between all of the available data in a manner that is simply much easier to develop than it would be for typical web apps. It’s very easy to create that ‘wow’-effect with your users in Silverlight. Obviously, that ‘wow’-effect isn’t the most important part of your application, but it does count for something.

Another interesting aspect of Silverlight development is that you can go back to a more statefull development model compared to the typically stateless nature of web aplications. After all, the cost of that state is no longer something your web server has to bear. It’s now the client who has to keep that state around, so you can avoid a few extra roundtrips here and there as well. Then again, you really don’t want your Silverlight application using huge amounts of RAM in your user’s browser either so you do need to take care not to go overboard with it. The development model is completely different than both WebForms and ASP.NET MVC, but if you already have people with WPF experience the learning curve is probably not that high.

However, testability isn’t great (yet) when it comes to Silverlight. It’s possible to write testable code, and you can execute tests in the Silverlight runtime, but it doesn’t really lend itself to a true TDD approach yet although i hope that will improve in the future.

So there you have it… the three options for .NET web development. I’d stay away from WebForms altogether from now on, and i’d decide between ASP.NET MVC and Silverlight on a case by case basis. What, you weren’t hoping for a definitive answer were you? :)

I would be interested in hearing your thoughts about pro’s and con’s of any of the options… particularly things that i haven’t mentioned, or if you just plain disagree with my statements. Which option would you prefer to use, or not to use?

Share/Save/Bookmark

Posted in ASP.NET, Software Development | 14 Comments »

Junior Vs Senior Developers?

Posted by Davy Brion on 29th December 2008

Chris Brandsma recently wrote an insightful post about how we shouldn’t coddle junior developers. It’s a good post and i can definitely understand Chris’ frustrations on the matter. There’s just one thing i don’t understand though: why do we even differentiate between junior and senior developers?

First of all, what’s the difference between a senior developer and a junior developer? Is it merely the number of years of experience? In previous client engagements, i’ve seen more than my share of bad developers who’ve had years and years of experience. Would i trust those developers more simply because they have the experience required to be called ’seniors’? Hell no. Trust has to be earned, i don’t care if you just graduated or if you’ve been writing code for 5 years or more.

When i have to work with someone i’ve never worked before, i assess this person’s qualities and capabilities on two things: how he thinks about writing code (in general), and how easy he can pick up new concepts/practices/principles. That’s it. A junior developer with little to no experience can often be a lot more valuable than a developer who has 5 years of experience under his belt and just assumes that he knows it all.

With a senior developer, you have to be lucky that he’s learned from his previous mistakes (and every developer makes mistakes, no matter how good he is or how much experience he has), that he hasn’t picked up too many bad habits and that he is open minded. If you can get a senior developer like that, consider yourself very, very lucky because there really aren’t that many of them.

With a junior developer, you can easily mold them into the kind of developer you want them to be. They haven’t really had a lot of time to pick up bad habits, and they are eager to prove that they belong at your company so they will be very eager to learn and improve. All you need is a couple of people who are willing and capable of teaching these young developers.

Of course, with junior developers you do have to live with the fact that they will make rookie mistakes. You have to review their work a bit more, and make sure that they learn from their mistakes. If you do this from the beginning, you’ll quickly notice that the extra reviewing tasks will soon take up less and less work.

At my company, we don’t really differentiate between juniors and seniors. The last couple of years, we’ve pretty much only hired young developers who just graduated. And so far, it’s worked out great. They never get assigned easier tasks or anything like that, and they have to do the same kind of stuff that people with more experience need to do. The result is that we have a bunch of young developers (i think the average age of our developers is 24 or something) who already do a great job, and they’re constantly getting better.

Share/Save/Bookmark

Posted in Opinions | 2 Comments »

Tired Of Working With Big Visual Studio Solutions?

Posted by Davy Brion on 29th December 2008

Ever noticed how Visual Studio can be painfully slow when it comes to working with big solutions? It starts using large amounts of RAM, building the project takes way too long, and with practically every change you make it has to rebuild a lot of the projects in the solution which can waste a tremendous amount of time if you add it all up.

Consider the following solution:

full_solution_tree

Now, i’m not going to get into the specifics of each project in this solution… most of these projects were created before i ever got involved with this project, and i’m not really happy with the entire structure. It’s a pretty big application, and a while ago we decided to move to a new architecture. But since we can’t just rewrite the whole thing, we put the new stuff (using the new architecture) in the same application and we’re going to gradually rewrite the old parts using the new architecture.

I wanted to keep the new stuff completely separated from the old stuff, so i added more projects to it (the EMS.* projects). Before i added the new projects to the solution, it was already painfully slow to use this solution with Visual Studio. After adding the new projects, it obviously only got worse. Since we’re spending most of our development work in the new projects, i wanted to see if i could simply create a new solution which would contain only the projects we usually need. That new solution looks like this:

smaller_solution_tree

Much better…. but now you’re probably thinking: doesn’t CMS.WebApplication reference any of the other projects? It does reference a few of them actually:

dependencies

Visual Studio indicates that it can’t resolve these references. So this new solution isn’t usable, right? Well, it is actually. You just have to make sure that you’ve done a full build of the entire solution (the one that has all of the projects in it) before you build the small one. If you use the small solution after you’ve built the big one, Visual Studio is smart enough to remember where it got those compiled dependencies from in the first place.

So is this really usable? It sure is… we do most of our work in the smaller solution, and we can modify and recompile as much as we want without problems and without wasting huge amounts of time just waiting for Visual Studio and the compiler. The only issue we have with this approach is when we need to make changes in some of the older projects that aren’t in the small solution. Whenever someone makes a change there that requires a recompile of the CMS.WebApplication project, every teammember needs to recompile the entire big solution. But to avoid having to load the entire solution in Visual Studio, you can just run the following command in a Visual Studio 2008 Command Prompt:


msbuild ems.sln

and it builds the entire solution without using Visual Studio. After that, your smaller solution will work again.

If you’re working with big Visual Studio solutions and the slowness of this bothers you, be sure to give this a shot. You can create as many of these small solutions as you like, depending on which parts of the codebase you typically need to work with. It can easily save you a lot of time, and avoid unnecessary frustration as well :)

For new solutions, i think it’s better to just keep the number of projects to a minimum which i’ve explained previously here

kick it on DotNetKicks.com

Share/Save/Bookmark

Posted in Visual Studio | 14 Comments »

It Was A Pretty Good Year

Posted by Davy Brion on 27th December 2008

2008 was a pretty good year for the .NET world. We’ve seen a pretty big rise in people’s interest, understanding and accepting of Object Relational Mapping, Inversion Of Control containers, writing testable code and separation of concerns. Those aren’t the only things that have improved in the .NET world this year, but i think those are the most important improvements we’ve seen from the developer community.

I’m also pretty happy with the way Microsoft is starting to open up the development of some of their projects, with ASP.NET MVC being a very nice example. They’re not doing true open source development yet, but at least they are listening to the community more and more. I’m especially happy with how people like Scott Hanselman, Phil Haack, and Glenn Block not only deal with the community, but are active (and positive) participants of it. Then again, there are definitely things that should’ve been handled better (Entity Framework, Oxite, LINQ To SQL’s future, …). Hopefully, we’ll get to see a lot less of those kind of mistakes in 2009. But all in all i think it’s been a rather impressive year from Microsoft’s Developer Division.

2008 has been pretty good for myself as well. I escaped from working in Enterprise Hell and now get to do a lot of interesting things at work with motivated and talented co-workers. I’ve also seen my subscriber count go from 40 to around 700 (on average) this year, which certainly provides a lot of motivation to keep going. I also joined some great bloggers at ElegantCode.com, and joined the NHibernate developers. Should keep me pretty busy in 2009 :)

I’m taking a few days off from blogging, so happy newyear everyone, and i’ll see you all early January :)

Share/Save/Bookmark

Posted in Off Topic | No Comments »

Gotta Love A Clean Development Environment

Posted by Davy Brion on 24th December 2008

Just installed a new development system for personal use… currently i only have the following installed:

  • Windows XP Professional, with Service Pack 3: i don’t have Windows 2008 and i still don’t consider Vista to be a valid option
  • SQL Server 2005 Developer Edition: i don’t have the 2008 version, plus the 2005 version more than suits my needs
  • Visual Studio 2008 with Service Pack 1: duh….
  • Resharper 4.1: duh… won’t use Visual Studio without it
  • TortoiseSVN + VisualSVN: TortoiseSVN is great already, but the Visual Studio integration that VisualSVN provides is so nice that i can’t go back to just using TortoiseSVN.
  • NHibernate Profiler: it’s not even out of private beta and i already consider this a must-have tool… i hope Ayende is gonna go easy on the licensing cost for this ;)
  • dotTrace: you gotta have a profiler, right?

Anything else i should consider installing? I only use this system for development so i don’t want any suggestions that aren’t related to that.

On a side note, despite being a Parallels customer i set this system up in VMWare Fusion. According to some reviews i read, Fusion beats Parallels when it comes to IO, making the system feel more ’snappy’. I’ve been very impressed with the Fusion performance already so i just bought a license and am planning to use Fusion exclusively from now on instead of Parallels.

Share/Save/Bookmark

Posted in Off Topic | 5 Comments »

The Unrealistic Deadline Anti-Pattern

Posted by Davy Brion on 23rd December 2008

I just read this post from Mohammad Azam about a project that was impossible to do using Agile practices.

I quote:

A reasonable deadline for the project was approximately 3 months but it had to be completed in a month. At this time an agile book will indicate that the developer should talk to the owner and come to a reasonable deadline. Unfortunately, in this case the owner was fixed with the deadline and was not willing to move it further.

The author further concludes that following the agile principles would have killed the project. He dropped some of the agile principles and practices, and finished the project in 29 days.

Yes, the resultant code was messy but at the end I get to keep my job.

I have no problem with Mohammad dropping agile practices/principles in order to complete this on time and to help him keep his job (especially in the current economy). I do have a problem with the idea that ‘Agile’ can kill a project. The only thing that killed this project is the unrealistic deadline which was set by the owner. The fact that the project was delivered within the requested time frame, and even assuming that it is completely satisfactory to the owner, does not mean that it was a good idea to hold this project to a deadline which only allowed for one third of the estimated workload.

Now some of you are probably thinking “the deadline couldn’t have killed the project since it was delivered within that deadline!”. True, to a point. We all know what happens when developers face tight deadlines: they take technical shortcuts and they accumulate technical debt. Mohammad already stated that the resulting code was messy so i guess it’s safe to assume there’s quite a bit of technical debt there. Being in technical debt is like owing money to Tony Soprano… you better get out of debt fast or things are gonna get much worse, very soon even. The longer you wait with paying off the debt, the more you’ll lose certain abilities and possibilities.

Getting out of technical debt can be pretty expensive, but there’s not really an alternative. If you don’t get out of debt, further maintenance of the code base and adding new features will only become more expensive over time. Failure to pay off the debt will sooner or later kill the project entirely because the gains that the project brings are no longer greater than the costs that come with it. At that point, the decision is often made to build a new system to replace the old one. The new one is gonna fix all of the problems of the old one. And if you’re lucky, the managers will have figured out by then that unrealistic deadlines only cost more money in the long term than a reasonable deadline would have.

Share/Save/Bookmark

Posted in Software Development | 7 Comments »

Favorite Operating System For Development?

Posted by Davy Brion on 22nd December 2008

With the recent news that the cutoff date for Windows XP has been extended by a few more months, i was wondering which operating system you guys prefer for development. So i’ve added a poll to the site (it’s on the right top of the page) where you can cast your vote.

I have to admit that i still prefer Windows XP, probably because it’s the lightest one of them all at the moment, and since i run XP in a Parallels VM on a cheap Macbook, that kinda matters ;)

At work, i’m using Windows Vista… not really happy with it though…

Share/Save/Bookmark

Posted in Off Topic | 7 Comments »

The Resolvable

Posted by Davy Brion on 21st December 2008

I wrote a post last week about a memory leak i had introduced in my code due to not properly releasing resolved components through the Windsor IoC container. I wanted to try to make sure that i’d never make that mistake again and this is the approach i came up with.

If you’re using an IOC container it’s important to not use it all over the place. You basically use it in as few places as possible to resolve a component and you let the container sort out all of the dependencies. So in the few places where you use the container directly, you need to resolve the component, and in case of transient components you also need to release them through the container. Releasing it is very easy to forget, so i wanted something that would guarantee that the component would be properly released. Enter the Resolvable class:

    public class Resolvable<T> : Disposable

    {

        private readonly T instance;

 

        public Resolvable() : this(null) {}

 

        public Resolvable(object argumentsAsAnonymousType)

        {

            if (argumentsAsAnonymousType == null)

            {

                instance = IoC.Container.Resolve<T>();

            }

            else

            {

                instance = IoC.Container.Resolve<T>(argumentsAsAnonymousType);

            }

        }

 

        public T Instance

        {

            get { return instance; }

        }

 

        protected override void DisposeManagedResources()

        {

            IoC.Container.Release(instance);

        }

    }

The Resolvable class inherits from my Disposable class, so the Disposable pattern is correctly implemented.

From now on, instead of calling the container directly, i just instantiate a new Resolvable in a using block. Let’s try it out.

I’m reusing my test component with a dependency from one of the previous posts:

    public interface IDependency : IDisposable

    {

        bool Disposed { get; set; }

    }

 

    public class MyDependency : IDependency

    {

        public bool Disposed { get; set; }

 

        public void Dispose()

        {

            Disposed = true;

        }

    }

 

    public interface IController : IDisposable

    {

        bool Disposed { get; set; }

        IDependency Dependency { get; }

    }

 

    public class Controller : IController

    {

        public IDependency Dependency { get; private set; }

 

        public Controller(IDependency myDependency)

        {

            Dependency = myDependency;

        }

 

        public void Dispose()

        {

            Dependency.Dispose();

            Disposed = true;

        }

 

        public bool Disposed { get; set; }

    }

Now, instead of resolving an IController directly through the container and having to dispose of it, i just do this:

        [Test]

        public void ResolvableInstanceIsProperlyReleasedAfterDisposal()

        {

            IoC.Container.Register(Component.For<IController>().ImplementedBy<Controller>().LifeStyle.Transient);

            IoC.Container.Register(Component.For<IDependency>().ImplementedBy<MyDependency>().LifeStyle.Transient);

 

            IController controller;

            IDependency dependency;

 

            using (var resolvable = new Resolvable<IController>())

            {

                controller = resolvable.Instance;

                dependency = controller.Dependency;

            }

 

            Assert.IsTrue(controller.Disposed);

            Assert.IsTrue(dependency.Disposed);

            Assert.IsFalse(IoC.Container.Kernel.ReleasePolicy.HasTrack(controller));

            Assert.IsFalse(IoC.Container.Kernel.ReleasePolicy.HasTrack(dependency));

        }

The container doesn’t hold the reference to the instance, and both the instance and its dependency is properly disposed.

Share/Save/Bookmark

Posted in Castle Windsor, Memory Management | 1 Comment »

Is This A Good Approach For Multi-Tenancy Or Not?

Posted by Davy Brion on 17th December 2008

Here’s the situation: we have an application which is used by multiple customers. The application consists of various functional modules. Each customer can use one or many (or obviously all) of these modules. In the past we used to deploy this application for each customer. The configuration file contained various settings that could differ from customer to customer and obviously, each deployed version had its specific configuration file depending on the settings required for each customer. This approach worked, but it was not really ideal.

Multi-tenancy to the rescue! Not sure if this counts as the official definition of multi-tenancy, but wikipedia defines it likes this:

Multitenancy refers to a principle in software architecture where a single instance of the software runs on a software-as-a-service (SaaS) vendor’s servers, serving multiple client organizations (tenants). Multitenancy is contrasted with a multi-instance architecture where separate software instances (or hardware systems) are set up for different client organizations. With a multitenant architecture, a software application is designed to virtually partition its data and configuration so that each client organization works with a customized virtual application instance.

Sounds like this is exactly what we’re looking for. So i’ve recently been working on changing the application to support this, and i came up with the approach i will outline in the rest of this post. The approach does not strictly comply with the definition above, but it does seem to comply with Ayende’s definition of it. I’d like to get some feedback from you guys as to whether you believe this approach is good or not, what could be better, what we need to keep in mind, etc…

First of all, i would like to point out that this application already exists. We already have a database with about 200 tables in it and there are about 150 pages (it’s a web app obviously). So obviously, we can’t just change everything to make it fully compliant with ‘the definition’.

Let’s start with the database. Instead of trying to use one huge database to keep all of the tenants’ data, which would require modifications in a large amount of the existing tables, we’ve decided to go with a separate database for each tenant. Each database will have an identical structure, regardless of whether some functional modules are used or not by a particular tenant. There is also one ‘master’ database which contains tenant-specific data. Basically it contains all of the configuration settings for each tenant, including connection strings to each tenants’ specific database. The connection strings do not contain user names and passwords as we will use Windows’ Integrated Security to connect to the specific databases (more on that in a bit).

Now for the application itself. Our first idea was to have one actual instance of the application, and the application would be able to determine the current tenant for each request based on the URL of the incoming request. Tenant A would have an URL like tenanta.ourproduct.com, tenant B would have tenantb.ourproduct.com etc. The application would basically use the URL to get the correct tenant-info from the master database (note that the connection string to the master database would be the only connection string we’d have in the application’s configuration file) and it would then use the tenant-specific database for each request with the tenant’s application URL.

The idea was to use an NHibernate SessionFactory for each specific tenant. You obviously can’t use just one because you’re using multiple databases. But we also use NHibernate’s 2nd Level Cache, which is problematic when you’re using multiple SessionFactories. The 2nd Level Cache is great, but it doesn’t differentiate between multiple SessionFactories. So if you have the result of a specific query cached, you could get that data back for a different tenant than the one the data actually belongs to if the query’s parameters happen to be identical. Btw, if i’m wrong about this please let me know.

So then we figured we could still use one physical deployment (as in: one physical folder where the application is located), and then we’d use multiple virtual directories in IIS which all point to the same physical folder. We’d basically have one virtual directory (and one instance of the application) per tenant. We still have the benefit of one physical deployment, and because each tenant’s ‘virtual’ application runs in its own AppDomain, the caching problem is no longer an issue. Each virtual directory is configured for the URL of its tenant and the running instance of the application can still retrieve the actual tenant’s data from the master database based on the URL. Each virtual directory can run in its own Application Pool which can be set up to run under a Windows account which is specific to the current tenant. This allows us to use Integrated Security when connecting to the tenant-specific database. So each tenant would only have access to the master database and its own specific database.

Obviously, this approach would require a bit more effort in our ‘management module’ (which is yet to be written). Whenever we need to add a tenant, we not only have to create a specific database for the tenant, we’d also have to create a new windows account for the tenant, set up a new virtual directory, and an application pool if each tenant indeed runs in its own application pool under it’s own Windows account.

Apart from the management module, i’ve modified the application to work with this approach in just a few days work. But, nothing is final just yet… so now i’d like to hear from you guys whether this is a good approach or not. What are the possible problems we need to take into account? Is this really still multi-tenancy? I guess the opinions on this will be divided, but it does largely solve the issue of multiple deployment and multiple configuration files. True, the configuration is now mostly in the master database and those settings need to be maintained as well. However, they could now be maintained without having to redeploy the application which is a plus. Some settings could even be modified by the tenant itself (at least, the users who have the proper privileges to do so).

So anyways, i’m awaiting your feedback :)

UPDATE: i’ve been told that i can simply use a different cache region for each tenant in NHibernate’s 2nd Level Cache… so i could avoid having to use multiple instances of the application. Still not sure on whether one instance for all tenants would be better than one instance for each tenant though.

Share/Save/Bookmark

Posted in Software Development | 3 Comments »