
{"id":1154,"date":"2012-12-06T20:08:12","date_gmt":"2012-12-07T01:08:12","guid":{"rendered":"http:\/\/www.ikriv.com\/blog\/?p=1154"},"modified":"2012-12-06T20:08:12","modified_gmt":"2012-12-07T01:08:12","slug":"another-example-for-object-factory","status":"publish","type":"post","link":"https:\/\/ikriv.com\/blog\/?p=1154","title":{"rendered":"Another Example for Object Factory"},"content":{"rendered":"<p>As one of the commentators correctly pointed out, it does not make much sense to create value objects such as <code>Order<\/code> via dependency injection, so my previous example was perhaps too contrived. The real life need for object factory was to encapsulate NHibernate session factory. So, a closer to real life example for object factory would look like this:<\/p>\n<p><code><\/p>\n<pre>using System;\nusing Microsoft.Practices.Unity;\n\nnamespace UnityObjectFactory\n{\n    class Program\n    {\n        static IUnityContainer _container = new UnityContainer();\n        static void Main(string[] args)\n        {\n            var factory = _container.Resolve&lt;SessionFactory&gt;();\n            _container.RegisterType&lt;ISession&gt;(new InjectionFactory(unused_container=&gt;factory.CreateSession()));\n\n            DoDbWork();\n            DoDbWork();\n        }\n\n        private static void DoDbWork()\n        {\n            using (var dbWorker = _container.Resolve&lt;DbWorker&gt;())\n            {\n                dbWorker.Work();\n            }\n        }\n    }\n\n    interface ISession : IDisposable\n    {\n        int SessionId { get; }\n        void ExecuteQuery(string query);\n    }\n\n    class Session : ISession\n    {\n        public Session(int id)\n        {\n            Console.WriteLine(\"Created session \" + id);\n            SessionId = id;\n        }\n\n        public int SessionId { get; private set; }\n\n        public void ExecuteQuery(string query)\n        {\n            Console.WriteLine(SessionId + \": \" + query);\n        }\n\n        public void Dispose()\n        {\n            Console.WriteLine(\"Closed session \" + SessionId);\n        }\n    }\n\n    class SessionFactory\n    {\n        private int _lastSessionId;\n\n        public ISession CreateSession()\n        {\n            Console.WriteLine(\"Session factory invoked. Working hard to create a session..\");\n            return new Session(++_lastSessionId);\n        }\n    }\n\n    class DbWorker : IDisposable\n    {\n        [Dependency]\n        public ISession Session { get; set; }\n\n        public void Work()\n        {\n            Session.ExecuteQuery(\"SELECT * FROM SomeBigTable\");\n        }\n\n        public void Dispose()\n        {\n            Session.Dispose();\n        }\n    }\n}\n<\/pre>\n<p><\/code><br \/>\n<a style=\"display:none\" href=\"http:\/\/www.codeproject.com\/script\/Articles\/BlogFeedList.aspx?amid=1181663\" rel=\"tag\">CodeProject<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>As one of the commentators correctly pointed out, it does not make much sense to create value objects such as Order via dependency injection, so my previous example was perhaps <a href=\"https:\/\/ikriv.com\/blog\/?p=1154\" class=\"more-link\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"Layout":"","footnotes":""},"categories":[3,16,5],"tags":[],"class_list":["entry","author-ikriv","post-1154","post","type-post","status-publish","format-standard","category-dotnet","category-demos","category-dev"],"_links":{"self":[{"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1154","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1154"}],"version-history":[{"count":0,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1154\/revisions"}],"wp:attachment":[{"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}